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

时间:2015-09-16 09:49:59

标签: java spring-batch

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

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

任何人都可以建议直接明确地终止步骤吗? 感谢。

2 个答案:

答案 0 :(得分:3)

据我所知,直接'停止步骤的方法并不存在 要终止步骤,您必须从null返回ItemReader.read(),这样当您处理旧对象时,您可以将标志设置为步执行上下文并将其用于:

  1. 防止处理当前块的其他项目
  2. 防止块处理项目写入
  3. 从读者返回null以停止步骤执行
  4. 如果知道更好的方式让我们知道! :)

答案 1 :(得分:1)

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

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

我找到了一个替代我在这里所描述的可能有效的方法。我一直在测试它正在研究的东西,它似乎是一种失败的方法,并允许它继续其他的东西。

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

在这种情况下,当我达到标准时,我在第一步失败了,它将进入秒步。当它成功完成时它将进入第三步,虽然我想你可以放弃第三步,如果你需要的话。