返回Spring Batch

时间:2016-12-02 10:36:15

标签: java spring spring-batch

我想使用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()方法的简单改变似乎可以解决问题。

1 个答案:

答案 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();
        }
    }
}