繁体   English   中英

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

[英]How to terminate step from a Spring batch job

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

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

任何人都可以建议一种直接而明确的方式来终止步骤吗? 谢谢。

据我所知,不存在停止步骤的“直接”方式。
要终止一个步骤,您必须从ItemReader.read()返回null ,因此当您处理旧对象时,您可以将一个标志设置为 step-execution 上下文并将其用于:

  1. 阻止处理当前块的其他项目
  2. 防止块处理项目写入
  3. 从读取器返回null以停止步骤执行

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

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

我知道不是完美的解决方案,因为开始 -> 停止 -> 开始,但如果没有其他工作,它可能可以通过处理批处理启动的外部脚本/应用程序进行管理。

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

<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"/>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM