Spring Batch:多种格式输出编写器

作为Spring Batch的坚定倡导者,我一直在谈论Spring Batch的概念,它为开发人员提供了一个框架,使他们可以专注于解决业务需求。 这样,它使开发人员不必花费过多的时间来解决所有技术问题以支持该解决方案。

为了说明我的意思,我们将采用我之前编写的Spring Batch示例之一,并针对需要的其他业务需求进行一些增强。

新问题

在我的Spring Batch系列的第三部分中,我们介绍了一个处理大型Excel文件输出的教程。

后来确定另一个业务部门需要相同的数据,但是他们需要以管道分隔的文本文件格式(只有三个字段)输出数据。

有两种不同的方法可以执行此操作,但是在本示例中,我将向您展示如何快速实现自己的ItemStreamReader ,该项目将写作委派给各个作家。

我们需要做的第一件事是创建ItemStreamReader的外壳。 我称之为MultiFormatItemWriter 。 这是外壳的样子:

package com.keyhole.example;import java.io.IOException;
import java.util.List;import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.annotation.AfterStep;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.ItemStreamWriter;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import com.keyhole.example.poi.StockData;@Component("multFormatItemWriter")
@Scope("step")
public class MultiFormatItemWriter implements ItemStreamWriter<StockData> {@Overridepublic void write(List<? extends StockData> items) throws Exception {}@BeforeSteppublic void beforeStep(StepExecution stepExecution) {}@AfterSteppublic void afterStep(StepExecution stepExecution) throws IOException {}@Overridepublic void open(ExecutionContext executionContext) throws ItemStreamException {}@Overridepublic void update(ExecutionContext executionContext) throws ItemStreamException {}@Overridepublic void close() throws ItemStreamException {}}

接下来,我们需要对上一个示例中的现有StockDataExcelWriter进行一些调整,以使其在新的MultiFormatItemWriter作为委托工作。 我还发现,前面的示例存在一些与来自Nasdaq的数据流有关的问题。 其中一个字段的格式已更改,该示例不再起作用,因此必须先解决该问题,然后我们才能继续。

  • 错误修复:将StockData上marketCap的字段类型从BigDecimal更改为String。 这些值现在在数据Feed中显示为“ $ 14.5M”和类似的值。
  • 错误修复:由于数据格式已更改并且这些博客文章大多使用静态示例,因此我在src / test / resources下的data.stock包中创建了一个名为companylist.csv的股票数据输入文件。
  • 错误修复:修改了库存数据读取器以使用此数据文件代替实时的Nasdaq提要。
  • StockDataExcelWriter删除了@Scope (“步骤”)注释。 这是必需的,因为MultiFormatItemWriter作用域是步骤级别。
  • StockDataExcelWriter删除了@BeforeStep@AfterStep批注,因为这些方法将直接从MultiFormatItemWriter中调用。
  • 注释了将每个记录写入Excel文件300次的write方法内部的for循环。 这用于大型excel文件演示,因此需要还原该示例才能再次使用。

现在,我们已经解决了StockDataExcelWriter ,我们需要解决业务所需的其他格式输出。 第二个输出应该在管道分隔的文本文件中,并且仅包含符号,名称和最后销售字段。

对于这个委托作者,我们将使用FlatFileItemWriter ,它是Spring Batch提供的许多输出组件之一。 要使用它,这是一个非常简单的配置更改,看起来像这样:

<bean name="pipeDelimitedExtractFile" class="org.springframework.batch.item.file.FlatFileItemWriter"><property name="resource" value="file:/data/example/excel/extract-example.txt" /><property name="lineAggregator"><bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"><property name="delimiter" value="|" /><property name="fieldExtractor"><bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"><property name="names" value="symbol,name,lastSale" /></bean></property></bean></property>
</bean>

由于Spring Batch具有扎根于Spring框架的基础,因此可以轻松配置提供的FlatFileItemWriter并将Bean连接到应用程序代码中。 在这种情况下,我们将使用提供的DelimitedLineAggregator创建FlatFileItemWriter ,将管道字符指定为定界符,并将fieldExtractor设置为使用BeanWrapperFieldExtractor

BeanWrapperFieldExtractor获取发送到ItemStreamWriter的StockData记录列表,并提取由逗号分隔的StockData bean中的字段名称列表指定的字段。 最后,指定用于输出的资源,在这种情况下为文件extract-example.txt,并将其写入/ data / example / excel目录。

现在,我们要做的就是将两个委托编写器连接到我们的MultiFormatItemWriter 。 确保在适当的方法中调用了委托编写器,然后完成! 这是MultiFormatITemWriter的最终代码清单:

package com.keyhole.example;import java.io.IOException;
import java.util.List;import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.annotation.AfterStep;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.ItemStreamWriter;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import com.keyhole.example.poi.StockData;
import com.keyhole.example.poi.StockDataExcelWriter;@Component("multFormatItemWriter")
@Scope("step")
public class MultiFormatItemWriter implements ItemStreamWriter<StockData> {@Autowiredprivate StockDataExcelWriter stockDataExcelWriter;@Autowired@Qualifier("pipeDelimitedExtractFile")private FlatFileItemWriter<StockData> extractWriter;@Overridepublic void write(List<? extends StockData> items) throws Exception {stockDataExcelWriter.write(items);extractWriter.write(items);}@BeforeSteppublic void beforeStep(StepExecution stepExecution) {stockDataExcelWriter.beforeStep(stepExecution);}@AfterSteppublic void afterStep(StepExecution stepExecution) throws IOException {stockDataExcelWriter.afterStep(stepExecution);}@Overridepublic void open(ExecutionContext executionContext) throws ItemStreamException {extractWriter.open(executionContext);}@Overridepublic void update(ExecutionContext executionContext) throws ItemStreamException {extractWriter.update(executionContext);}@Overridepublic void close() throws ItemStreamException {extractWriter.close();}}

如您所见,这里确实没有太多工作要做,这就是我想指出的。 我并没有真正显示出使用某些内置的读取器和写入器可以简单地实现某些业务解决方案。

最后的想法

现在我确实提到了解决此问题的几种方法。 第二个将利用Spring Batch随附的CompositeItemWriter 。 它所做的几乎和我在这里所做的完全相同,只是它获取了ItemWriters的列表并在实现的每个方法中循环遍历它们。

在那种情况下,我将转换我的StockDataExcelWriter来实现ItemStreamReader接口,并且将用CompositeItemWriter代替MultiFormatOutputWriter ,它将在作业配置xml中进行配置。 更少的代码。

因此,我今天在本文中的观点是表达如何使用Spring Batch提供的几个已经实现的组件轻松解决最常见的任务和业务解决方案。

这个示例和其他示例可以在GitHub的以下位置找到: https : //github.com/jonny-hackett/batch-example 。

翻译自: https://www.javacodegeeks.com/2016/08/spring-batch-multiple-format-output-writer.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《七哥说道》第五章:入职惨做苦力,画饼一望无际

【转载请注明】&#xff1a; 原文出处&#xff1a;https://www.cnblogs.com/jstarseven/p/10521426.html 作者&#xff1a;jstarseven 码字挺辛苦的..... “你是住在回龙观东大街附近吗&#xff0c;那先不急下班&#xff0c;一会我开车顺带你回去吧&#xff01;” 第二家公司的…

通过源码将git升级到最新版

因为go-get下载hugo失败&#xff0c;需要升级git到最新版本。 下载最新git代码 wget -O git-master.zip https://github.com/git/git/archive/master.zip编译 unzip git-master.zip cd git-masteryum install openssl-devel curl-devel expat-devel perl-ExtUtils-MakeMaker …

win10只有edge浏览器能上网的解决方法

问题描述&#xff1a;电脑就只有edge浏览器和自带的邮件可以上网&#xff0c;但是QQ Chrome&#xff0c;360浏览器都无法上网&#xff1b; 解决方法&#xff1a;打开命令提示符&#xff08;管理员&#xff09;&#xff0c;执行netsh winsock reset&#xff0c;重启系统就好了。…

CTF dotNet逆向分析

题目来源http://ctf.idf.cn/index.php?ggame&marticle&aindex&id36 .NET逆向第一题 嗯&#xff0c;看名字就应该明白了&#xff0c;快去下载吧&#xff01; http://pan.baidu.com/s/1bnvVbp9 下载后是一个DotNetCrackMe1.exe文件。 分析 逆向分析的基础问题&…

xaas_从XaaS到Java EE – 2012年哪款该死的云最适合我?

xaas您是否曾经想过要使Java EE正常运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决方案。 在…

day3----python变量与常量

一、python变量&#xff1a; 1、概述&#xff1a;&#xff08;1&#xff09;程序可操作的存储空间的名称&#xff1b;&#xff08;2&#xff09;程序运行期间可以改变的数据&#xff08;3&#xff09;每个变量都有特定的类型 2、作用&#xff1a;将不同类型的数据存储到内存中 …

垃圾收集中的代际差异

去年&#xff0c;我一直在帮助新兴公司Instana创建一个Java代理&#xff0c;该代理可跟踪Java应用程序中的执行情况。 收集并结合此执行数据以生成用户请求以及系统所有者半球内服务之间的最终通信的跟踪。 这样&#xff0c;可以可视化非结构化通信&#xff0c;从而显着简化了由…

简单解释 MapReduce 算法

一个有趣的例子 你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃&#xff1f; MapReduce方法则是&#xff1a; 给在座的所有玩家中分配这摞牌 让每个玩家数自己手中的牌有几张是黑桃&#xff0c;然后把这个数目汇报给你 你把所有玩家告诉你的数…

appium + python 搭建

appium python 1、安装jdk地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html配置&#xff1a;系统变量新建JAVA_HOME,输入jdk安装路径&#xff0c;如&#xff1a;C:\Program Files\Java\jdk1.8.0_201。系统变量新建CLAS…

ubuntu 12.04 /sbin/ldconfig.real: /usr/local/lib/*.so.8 不是符号连接 解决办法

最近在ubuntu12.04下使用sudo apt-get install安装软件的时候最后总会报这种错误。建立硬连接即可解决&#xff1a; sudo ln -sf /usr/local/lib/libprotobuf.so.8.0.0 /usr/local/lib/libprotobuf.so.8 截图上传没成功&#xff0c;麻烦。 在弄一次。

Linux GCC常用命令

1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成可执行文件 5.2链接 5.3强制链接时使用静态链接库 1简介 GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展&#…

JDK 9 @不建议使用的注释增强功能

在帖子中&#xff0c; Deprecated可能会是什么样子&#xff1f; &#xff0c;我当时使用JEP 277 &#xff08;“增强的弃用”&#xff09;的描述来指导创建增强的自定义Deprecated注释。 但是&#xff0c;自从发布该文章以来&#xff0c;JEP 277进行了重大更改。该文章总结了J…

数据结构和算法基础之冒泡排序

/// <summary>/// 冒泡排序/// </summary>/// <param name"arry"></param>public static void BubbleSort(int[] arry){for (int i 0; i < arry.Length; i)//外层循环控制排序趟数{for(int j0;j<arry.Length-i-1;j)//内层循环控制每一…

Java Web应用程序的SecureLogin

不&#xff0c;标题中没有缺少空格。 这与安全登录无关 &#xff0c;而与安全顾问Egor Homakov开发的SecureLogin协议有关&#xff0c;该协议因在没有权限的情况下致力于掌握 Rails项目而闻名 。 SecureLogin协议非常有趣&#xff0c;因为它不依赖任何中央方&#xff08;例如&…

最通俗的CRC校验原理剖析

以下内容摘自笔者即将出版的最新著作《深入理解计算机网络》一书。本书将于12月底出版上市&#xff0c;敬请留意&#xff01;&#xff01; 本书原始目录参见此文&#xff1a;http://winda.blog.51cto.com/55153/1063878 5.3.2 循环冗余校验检错方案 上节介绍的奇偶校验码&#…

SpringMVC 上传文件and过滤器

SpringMVC提供了一个MultipartResolver接口用来实现文件上传&#xff0c;并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver。如果要在SpringMVC中实现文件上传功能&#xff0c;就可以在springmvc.xml中配置MultipartResolver接口的实现类。 以下…

guava 集合转换_Guava的Collections2:过滤和转换Java集合

guava 集合转换Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java&#xff0c;这是本文的主题。 Guava的Collections2类具有两个公共方法&#xff0c;这两个方法都是静态的。 方法filter&#xff08;Collec…

CRC校验算法的解析,暨对网上的CRC详解的补充

一、CRC的形象理解 本文面向对CRC校验有一定基础的读者&#xff0c;如果你不懂&#xff0c;请戳这里。维基百科还有图解版的。 在CRC的具体实现中&#xff0c;如果要计算CRC的数据很长&#xff0c;一般都会用到寄存器&#xff0c;用来保存当前的计算到的CRC&#xff0c;循环计算…

7.5 GRASP原则五:高内聚 High Cohesion

GRASP原则五&#xff1a;高内聚 High Cohesion   How to keep objects focused, understandable and manageable, and as a side effect support Low Coupling? 如何使对象功能专注、可理解、可管理&#xff0c;同时又支持 低耦合&#xff1f;5.1 GRASP rule 5&#xff1…

资源泄漏:救援的命令模式

多年来&#xff0c; 使用Plumbr进行性能监视时&#xff0c;我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中&#xff0c;我想描述一种最简单的方法来清理资源并避免该问题。 首先&#xff0c;我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在…