在Spring批处理中,有一种方法可以在超过跳过限制时强制执行步骤

时间:2016-10-14 08:28:04

标签: spring spring-batch

我有一个简单的批处理过程,并设置了跳过限制。超过跳过限制时,作业失败,它永远不会进入第二步。如果跳过限制已经过去,我希望该过程转到第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>

有办法做到这一点吗?我已经尝试设置“下一步”,但抛出一个错误,说明不能有下一个属性和一个过渡元素。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

您可以在步骤中添加public function set_greeting(){ $this->session->set_userdata( 'greetings', 'hi!' ); $greetings = $this->session->userdata('greetings'); $this->output->set_output($greetings); // Note: set output data here. } 。即使步骤失败,也会执行StepExecutionListener。在此方法中,您可以获取步骤的退出状态并进行更改:afterStep(StepExecution stepExecution)

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

注意:在有太多例外情况后跳过一个步骤听起来不是好的设计,但只要你知道自己在做什么......

答案 1 :(得分:0)

我已设法使用“下一步”修复它。我还包括下一个属性 步骤声明中设置了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">会导致作业失败。