Trivadis银行的Spring Batch实践教训

  这是一篇成立于2010年的Trivadis银行使用Spring batch每天进行多次CSV文件输入输出处理的案例,这个批处理可以由第三方系统启动,也是可以由本系统用户手工启动定期运行。

建立这个批处理系统有几个要求:

1. 性能: 基于多线程的并行处理,执行顺序不是很重要,在Job执行前后都可以改变线程数量。

2. 重新处理失败条目,将处理失败的条目返回,产生每个条目的执行情况状态,这个状态需要维护。

3. 发送总结邮件:执行完成后,汇总批处理执行情况,包括Exceptions,错误数量,邮件发送给这个job提交者和运维人员。

4.收集Job细节信息,失败条目的跟踪trace信息,以便具体诊断。

5.定期触发Job,可以一定时间定期触发批处理。

6.为防止过载,限制并行Job数量

7.可以失效一个Job执行,暂停Job执行。

8.Job之间也许可能会触发依赖,完成的Job触发依赖它的其他Job。

将上面整个需求总结提炼为四个实现主题:

1. 分区
2.出错处理
3.监控和跟踪
4.Job跟踪
5.数据模型

 

数据模型

将第一个数据加入到第二个数据记录中。

 

Job控制

我们先看看Spring Batch job的结构:

SpringBatch是由Job和Step两大部分组成,其中主要以Job为主,具体Job是以Job Instance为代表,每个Job Instance以Job Parameter作为输入参数,然后交由Job Execution,在执行上下文中执行,同样Step也有执行器和执行环境。

使用cron格式定义触发引擎,实际上是一种Job launcher,使用Spring Batch的SimpleJobLauncher。

数据分片

使用Spring Batch的Partitioning Step,实现本地和远程分布式处理。

 

错误处理

对于执行Job失败的条目有两个应对方式:

1. 忽视,没有致命Exception

2. 重试,暂时短暂的Exception,重试一下,重新启动。实现Job的可重新启动执行.

 

监控和跟踪

使用Spring Batch Admin进行管理监控。将处理日志输出到数据库中,设置一个错误监听器,将错误分类为可忽视或错误类别。

 

总结:

Spring批处理只要花费很小的努力就能实现可靠的事务性的批处理作业。在少数情况下,甚至不需要Java代码。根据不同层次要求可灵活定制。

 

Spring Batch