在 spring 批处理中,如果超过跳过限制,是否有办法强制执行一个步骤

In spring batch is there a way to force the execution to a step if the skip limit has been surpassed

我有一个设置了跳过限制的简单批处理。当超过跳过限制时,作业失败并且永远不会进入第二步。如果跳过限制已过,我希望流程转到第 3 步。

<job id="jobA" incrementer="runIdIncrementer" >
    <step id="step1" next="step2">
        <tasklet>
            <chunk commit-interval="10"  reader="dReader" writer="dWriter" skip-limit="100">
                <skippable-exception-classes>
                    <include class="java.lang.Exception"/>
                </skippable-exception-classes>
            </chunk>
            <listeners>
                <listener ref="skipListener"/>
            </listeners>
        </tasklet>
    </step>
    <step id="step2" next="step3">
        <tasklet>
            <chunk commit-interval="10"  reader="sReader" writer="sWriter"/>
        </tasklet>
    </step>     
    <step id="step3">
        <tasklet ref="cleanUpStep"/>
    </step>
</job>

有办法吗?我试过设置 "next" 但抛出了一个错误,指出不能有下一个属性和过渡元素。

任何帮助都会很棒。

您可以在步骤中添加 StepExecutionListener。即使步骤失败,afterStep(StepExecution stepExecution) 也会执行。在该方法中,您可以获取步骤的退出状态并更改它:stepExecution.setExitStatus(ExitStatus.COMPLETED)

您可能想检查错误是否来自超出跳过限制,也许 stepExecution.getFailureExceptions() 并搜索 SkipLimitExceededException(或类似的东西)。您还可以获得跳过项目的数量并将其与您的最大值进行比较(但是,如果它是 100 跳过的 Error,也许您应该做其他事情......)

注意:在有太多异常后跳过一个步骤听起来不像是好的设计,但只要您知道自己在做什么...

我已经使用 "next" 修复了它。我在包括下一个属性的同时也有 next="step2" 在步骤声明中设置。修复方法是从此处删除它,然后您可以添加下一个属性。

<step id="step1">
    <tasklet>
        <chunk commit-interval="10"  reader="dReader" writer="dWriter" skip-limit="100">
            <skippable-exception-classes>
                <include class="java.lang.Exception"/>
            </skippable-exception-classes>
        </chunk>
        <listeners>
            <listener ref="skipListener"/>
        </listeners>
    </tasklet>
<next on="*" to="step2" />
</step>

即使已达到跳过限制,以上代码仍将继续执行步骤 2。 <step id="step1" next="step2"> 如果达到限制,将导致作业失败。