我想使用Spring Batch实现类似于以下的Job:
Step1 -----> Step2 --> End
^ |
| |
------------
在Step2的某个条件下,由Step2的自定义ExitCode确定,Step1再次启动,然后再启动Step2,或者处理结束。
我想象的是这样的事情:
return jobBuilderFactory.get("jobName").incrementer(new RunIdIncrementer())
.start(step1()).next(step2())
.on("condition1").end()
.from(step1())
.on("condition2").to(step1()).end().build();
但显然,在通过Step2的condition2处理Step1之后,Step2将不会再次启动。
如何实现这种递归批处理?
编辑:我设法找到了一个解决方案,然而,我还不知道它是否只是一个肮脏的解决方案,因为它似乎很容易:
jobBuilderFactory.get("jobName")
.flow(step1())
.next(step2())
.on("launchStep1Again")
.to(step1())
.from(step2())
.on("endJobExecution")
.end().build().build();
因此,从使用Fluent API的.start()方法到其.flow()方法的简单改变似乎可以解决问题。
答案 0 :(得分:0)
我认为您可以扩展StepExecutionListenerSupport类并按如下方式修改配置:
<step id="step1" next="step2">
<tasklet ref="step1Tasklet" allow-start-if-complete="true"/>
</step>
<step id="step2">
<tasklet ref="step2Tasklet"/>
<listeners>
<listener ref="myListener"/>
</listeners>
<next on="Back" to="step1"/>
</step>
public class MyListener extends StepExecutionListenerSupport {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if(wantToLoop) {
return new ExitStatus("Back");
} else {
return stepExecution.getExitStatus();
}
}
}