在大型企业中,由于业务复杂,数据量大,数据格式不同,数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理。而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理。这样的过程就是“批处理”。
批处理应用通常有以下特点:
-
<李>数据量大,从数万到数百万甚至上亿不等;李>
<李>整个过程全部自动化,并预留一定接口进行自定义配置;李>
<李>这样的应用通常是周期性运行,比如按日,周,月运行,李>
<李>对数据处理的准确性要求高,并且需要容错机制,回滚机制,完善的日志监控等。李>
<强>什么是Spring batch 强>
Spring batch是一个轻量级的全面的批处理框架,它专为大型企业而设计,帮助开发健壮的批处理应用.Spring批为处理大批量数据提供了很多必要的可重用的功能,比如日志追踪,事务管理,工作执行统计,重启工作和资源管理等。同时它也提供了优化和分片技术用于实现高性能的批处理任务。
它的核心功能包括:
-
<李>事务管理李>
<李>基于块的处理过程李>
<李>声明式的输入/输出操作李>
<李>启动,终止,重启任务李>
<李>重试/跳过任务李>
<李>基于Web的管理员接口李>
笔者所在的部门属于国外某大型金融公司的CRM部门,在日常工作中我们经常需要开发一些批处理应用,对Spring Batch有着丰富的使用经验。近段时间笔者特意总结了这些经验。
<强>使用Spring Batch 3.0以及弹簧启动强>
在使用Spring Batch时推荐使用最新的Spring Batch 3.0版本。相比春天Batch3.2,它做了以下方面的提升:
-
<李>支持jsr - 352标准李>
<李>支持Spring4以及Java8李>
<李>增强了Spring Batch集成的功能李>
<李>支持JobScope李>
<李>支持SQLite李>
支持Spring4和Java8是一个重大的提升。这样就可以使用Spring4引入的弹簧引导组件,从而开发效率方面有了一个质的飞跃。引入Spring batch框架只需要在build.gradle中加入一行代码即可:
编译(“org.springframework.boot: spring-boot-starter-batch”)
而增强Spring Batch集成的功能后,我们就可以很方便的春天和家族的其他组件集成,还可以以多种方式来调用工作,也支持远程分区操作以及远程块处理。
而支持JobScope后我们可以随时为对象注入当前工作实例的上下文信息。只要我们制定Bean的范围为工作范围,那么就可以随时使用jobParameters和jobExecutionContext等信息。
& lt; bean id="…" class="…"范围=肮ぷ鳌痹? & lt;属性名="名称" value=" https://www.yisu.com/zixun/# {jobParameters[输入]}"/比; & lt;/bean> & lt; bean id="…" class="…"范围=肮ぷ鳌痹? & lt;属性名="名称" value=" https://www.yisu.com/zixun/# {jobExecutionContext [' input.name ']} . txt”/比; & lt;/bean>
<强>使用Java配置而不是xml的配置方式强>
之前我们在配置工作和步骤的时候都习惯用xml的配置方式,但是随着时间的推移发现问题颇多。
-
<李> xml文件数急剧膨胀,配置块长且复杂,可读性很差,李>
<李> xml文件缺少语法检查,有些低级错误只有在运行集成测试的时候才能发现,李>
<李>在xml文件中进行代码跳转时IDE的支持力度不够。李>
我们渐渐发现使用纯Java类的配置方式更灵活,它是类型安全的,而且IDE的支持更好。在构建工作或步骤时采用的流式语法相比xml更加简洁易懂。
@ bean 公共一步一步(){ 返回stepBuilders.get(步骤) 灵活;伙伴,Partner>块(1) .reader(读者()) .processor(处理器()) .writer(作家()) .listener (logProcessListener ()) .faultTolerant () .skipLimit (10) .skip (UnknownGenderException.class) .listener (logSkipListener ()) .build (); }
在这个例子中可以很清楚的看到该步骤的配置,比如读者/处理器/作家组件,以及配置了哪些侦听器等。
<强>本地集成测试中使用内存数据库强>
Spring batch在运行时需要数据库支持,因为它需要在数据库中建立一套模式来存储工作和步骤运行的统计信息。而在本地集成测试中我们可以借助Spring batch提供的内存库来存储Spring batch的任务执行信息,这样即避免了在本地配置一个数据库,又可以加快工作的执行。