如何从 Spring 批处理作业中终止步骤

How to terminate step from a Spring batch job

在检查记录是否在 90 天前创建的处理器中,如果 reader 读取了过时的记录,我想终止步骤,而不是作业。

我尝试了 stepExecution.setStatus()、stepExecution.setEndTime(new Date()) 等。

任何人都可以建议一个直接和明确的方法来终止步骤吗? 谢谢

据我所知 'direct' 停止步骤的方法不存在。
要终止一个步骤,你必须从 ItemReader.read() return null 所以当你处理一个旧对象时,你可以在步骤执行上下文中设置一个标志并将其用于:

  1. 阻止处理当前块的其他项目
  2. 防止块处理项目写入
  3. return null 从 reader 停止步骤执行

如果有人知道更好的方法,请告诉我们! :)

这可能不适合您的情况,但它是一个可能的选择。在 spring 批处理文档的 5.3.3 部分中,它描述了将停止元素添加到步骤中。您可以设置停止条件。因此,在您的示例中,您可以通过抛出异常来使作业失败。同样在该停止元素定义中,您可以定义一个重新启动步骤,这可能是您处理的下一步。

我不知道完美的解决方案,因为开始 -> 停止 -> 开始,但如果没有其他方法可以通过处理批处理启动的外部 scripts/apps 进行管理。

我找到了一种替代我在此处描述的方法的方法,该方法也可能有效。我一直在对我正在做的事情进行一些测试,这似乎是一种让一步失败并允许它继续做其他事情的方法。

<step id="firststep" parent="fs" next="failDecision" />
<decision id="failDecision" decider="decider">
    <next on="FAILED" to="secondstep" />
    <next on="COMPLETED" to="thirdstep" />
</decision>
<step id="secondstep" parent="fs"/>
<step id="thirdstep" parent="fs"/>

在这种情况下,当我满足该标准时,我在第一步失败了,它将进入第二步。当它成功完成后,它将进入第三步,尽管我想如果你需要的话你可以放弃第三步。