我有一个简单的批处理过程,并设置了跳过限制。超过跳过限制时,作业失败,它永远不会进入第二步。如果跳过限制已经过去,我希望该过程转到第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>
有办法做到这一点吗?我已经尝试设置“下一步”,但抛出一个错误,说明不能有下一个属性和一个过渡元素。
任何帮助都会很棒。
答案 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">
会导致作业失败。