春季批处理:在面向块的处理中重复步骤

时间:2020-03-02 17:01:36

标签: spring-batch

我想知道是否可以以某种方式配置作业,以便我可以重复几个分块的步骤,直到处理完所有数据? 背景是,我需要处理一些真实的大数据,并且在处理这些数据时,存在意外中止的风险。为了防止从头开始一遍又一遍地重新启动,我想对数据进行一些分区,这些分区可用于遍历分块的步骤。 由于给定的数据,很遗憾,无法利用spring-batch可重启作业功能来达到我的目标。 我的源数据库由几个或多或少的松散连接的表组成,每个表都在自己的步骤中进行处理。所以我有类似的东西:

... omitting job-configuration ...
<batch:step="A" next="B">
   <batch:tasklet>
       <batch:chunk reader="readerA" writer="writerA" commit-interval="1000" />
   </batch:tasklet>
</batch:step>
<batch:step="B" next="C">
   <batch:tasklet>
       <batch:chunk reader="readerB" writer="writerB" commit-interval="5000" />
   </batch:tasklet>
</batch:step>
... some more steps with similar set-up...

每个阅读器都有其自己的SQL语句,以从源数据库获取必要的数据,并将结果写入目标数据库的另一个表中。

现在,我的想法是,以某种方式适应这些SQL,将数据划分为一些不相交但一致的(*)部分,以便我可以像以前一样使用分块步骤重复进行处理。也许只添加一些“父步骤”来控制循环是否必须结束。

(*)“不相交但一致”的意思是,尽管不同步骤中的数据是从不同的表中获取的,但它们之间还是存在依赖关系的。例如,获取要执行步骤B的数据将与表A进行联接,仅选择已成功处理的集合。

感谢您的任何建议! /安德烈亚斯(Andreas)

1 个答案:

答案 0 :(得分:0)

由于表之间存在依赖关系,所以我认为并行处理是不合适的。当分区彼此独立时,并行是有意义的。

您当前的设置应允许您从两个级别的中断处重新开始工作:

  • 在步骤之间:如果作业在步骤B失败,则不会重新执行步骤A
  • 在每个步骤中:如果作业在步骤A的中间失败,它将从步骤A的最后一个成功提交的块重新开始。

您需要确保使用持久性作业存储库,并在出现故障的情况下重新启动相同作业实例(使用与上一次运行相同的标识作业参数)。