在 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">
如果达到限制,将导致作业失败。
我有一个设置了跳过限制的简单批处理。当超过跳过限制时,作业失败并且永远不会进入第二步。如果跳过限制已过,我希望流程转到第 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">
如果达到限制,将导致作业失败。