我想知道是否可以以某种方式配置作业,以便我可以重复几个分块的步骤,直到处理完所有数据? 背景是,我需要处理一些真实的大数据,并且在处理这些数据时,存在意外中止的风险。为了防止从头开始一遍又一遍地重新启动,我想对数据进行一些分区,这些分区可用于遍历分块的步骤。 由于给定的数据,很遗憾,无法利用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)
答案 0 :(得分:0)
由于表之间存在依赖关系,所以我认为并行处理是不合适的。当分区彼此独立时,并行是有意义的。
您当前的设置应允许您从两个级别的中断处重新开始工作:
您需要确保使用持久性作业存储库,并在出现故障的情况下重新启动相同作业实例(使用与上一次运行相同的标识作业参数)。