【问题标题】:Spring-batch: Repeat steps in chunk oriented processingSpring-batch:在面向块的处理中重复步骤
【发布时间】:2020-03-02 17:01:36
【问题描述】:

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

... 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 进行连接,只选择成功处理的集合。

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

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

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

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

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

    您需要确保使用持久的作业存储库并在失败的情况下重新启动相同作业实例(使用与上次运行相同的识别作业参数)。

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 2019-12-05
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多