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

Java 如何从Spring批处理作业终止步骤,java,spring-batch,Java,Spring Batch,在检查记录是否在90天前创建的处理器中,如果读卡器读取了过期记录,我希望终止该步骤,而不是作业 我尝试了stepExecution.setStatus()、stepExecution.setEndTime(new Date())等等 有人能提出一种直接而明确的终止步骤的方法吗? 谢谢。据我所知,停止一步的“直接”方法并不存在。 要终止一个步骤,您必须从ItemReader.read()返回null,这样当您处理一个旧对象时,您可以在步骤执行上下文中设置一个标志,并使用它来: 阻止处理当前区块的其

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

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

有人能提出一种直接而明确的终止步骤的方法吗?
谢谢。

据我所知,停止一步的“直接”方法并不存在。
要终止一个步骤,您必须从
ItemReader.read()
返回
null
,这样当您处理一个旧对象时,您可以在步骤执行上下文中设置一个标志,并使用它来:

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

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

    据我所知,不存在“直接”停止步骤的方法。
    要终止一个步骤,您必须从
    ItemReader.read()
    返回
    null
    ,这样当您处理一个旧对象时,您可以在步骤执行上下文中设置一个标志,并使用它来:

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

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

    这可能不适合您的场景,但这是一种可能的选择。在spring批处理文档的第节中,它描述了将stop元素添加到步骤中。您可以设置停止条件。因此,在您的示例中,您可能会通过抛出异常而导致作业失败。此外,在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"/>
    
    
    

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

    这可能不适合您的场景,但这是一个可能的选择。在spring批处理文档的第节中,它描述了将stop元素添加到步骤中。您可以设置停止条件。因此,在您的示例中,您可能会通过抛出异常而导致作业失败。此外,在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"/>
    
    
    

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

    是的。我是这样做的。当读卡器遇到第一个不应该删除的项时,它返回null,这意味着是时候退出此步骤了。谢谢。这有助于我确保我的解决方案可能是好的;)对我是这样做的。当读卡器遇到第一个不应该删除的项时,它返回null,这意味着是时候退出此步骤了。谢谢。这有助于我确保我的解决方案可能是好的;)