这是一篇成立于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.数据模型
将第一个数据加入到第二个数据记录中。
我们先看看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