我有一个弹簧批处理作业,比方说5步(step1 --> step2 --> step3 --> step4 --> step5
)。我已经配置了一个StepExectutionListener
,它可以监听2个事件
beforeStep()
和afterStep()
。
我的问题是,如果我处于当前的beforeStep()
方法中,并且要执行的步骤是step2
,我可以再次执行弹簧批处理step1
吗?执行step1
后,流程应继续step2
,step3
等等。
为了再次澄清,我可以告诉spring-batch再次从之前执行的步骤“开始执行”吗?
答案 0 :(得分:1)
虽然我可能不会推荐这种行为,是的,它应该能够完成。您需要做的是将step2配置为使用正确的退出代码转换到step1,并且step1将需要能够重新运行。
配置
<step id="step1" next="step2">
<tasklet ref="someTasklet" allow-start-if-complete="true"/>
</step>
<step id="step2">
<tasklet ref="someOtherTasklet"/>
<listeners>
<listener ref="loopingListener"/>
</listeners>
<next on="BACK" to="step1"/>
</step>
代码
public class LoopingListener extends StepExecutionListenerSupport {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if(shouldLoop) {
return new ExitStatus("BACK");
} else {
return stepExecution.getExitStatus();
}
}
}
答案 1 :(得分:0)
您可以使用以下方法实现步骤的特定顺序。
<step id="step1" next="step3">
<tasklet>(...)</tasklet>
</step>
下一个参数将定义下一个将执行的参数。 但是我不确定你是否可以退回到同一个执行中。但是,如果使用
,Spring允许您重新启动一个步骤允许 - 开始 - 如果完成
为真。
另外,对于构建工作流程,请查看http://docs.spring.io/spring-batch/2.2.x/apidocs/org/springframework/batch/core/job/builder/FlowBuilder.SplitBuilder.html
希望这有帮助。