gpt4 book ai didi

java - 返回到 Spring Batch 中的上一个步骤

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:48 24 4
gpt4 key购买 nike

我想使用 Spring Batch 实现类似于以下的作业:

Step1 -----> Step2 --> End
^ |
| |
------------

在第 2 步中的某些情况下,由第 2 步的自定义 ExitCode 确定,要么再次启动第 1 步,然后再次启动第 2 步,要么处理将结束。

我想象的是这样的:

return jobBuilderFactory.get("jobName").incrementer(new RunIdIncrementer())
.start(step1()).next(step2())
.on("condition1").end()
.from(step1())
.on("condition2").to(step1()).end().build();

但是很明显,Step1经过Step2的condition2处理后,Step2就不会再开始了。

如何实现这样的递归批处理?

编辑:我设法得到了一个解决方案,但是,我还不知道它是否只是一个肮脏的解决方案,因为它似乎很简单:

jobBuilderFactory.get("jobName")
.flow(step1())
.next(step2())
.on("launchStep1Again")
.to(step1())
.from(step2())
.on("endJobExecution")
.end().build().build();

因此,从使用 Fluent API 的 .start() 方法到其 .flow() 方法的简单更改似乎可以解决问题。

最佳答案

SpringBatch 并非用于处理递归循环。虽然您可以绕过它,但在出现故障和重新启动时您会遇到问题。

SpringBatch 在其执行上下文中存储一个步骤的读者和作者的当前“位置”;为了能够在上次崩溃的位置重新启 Action 业。

因此,如果作业重新启动,SpringBatch 将假定这是作业的第一次执行。

根据您的工作结构,这可能不是问题,但您必须牢记这一点。

在我看来,更好的解决方案是在处理作业之外的单独类中实现处理循环,该类处理启 Action 业。

以下两个问题的答案可能有助于提出这样的解决方案:

Make a spring-batch job exit with non-zero code if an exception is thrown

Reset state before each Spring scheduled (@Scheduled) run

关于java - 返回到 Spring Batch 中的上一个步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com