spring-batch(java-config)使用JobExecutionDecider识别和执行步骤

时间:2015-09-11 16:07:49

标签: spring-batch multi-step

我有3个步骤A,B,C,它们应该在序列A-> B-> C中执行,其中B是可选的。我只根据某些条件执行步骤B.我使用JobExecutionDecider决定如下:

@Bean(name = "decider")
JobExecutionDecider isStepRequired {
    return new JobExecutionDecider() {
        @Override
        public FlowExecutionStatus decide(final JobExecution jobExecution, final StepExecution stepExecution) {
            if (condition not satisfied) {
                // return status to skip step B and go to step C
                return FlowExecutionStatus.COMPLETED;
            }
            // return status to proceed with step B
            return new FlowExecutionStatus("CONTINUE");
        }
    };
}

在作业配置中,我有以下代码段,

@Bean
Job constructJob(final JobBuilderFactory jobs, final Step a, final Step b, final JobExecutionDecider decider, final Step c) {
    final JobBuilder jobBuilder = jobs.get("Job");
    final JobFlowBuilder builder = jobBuilder.flow(a);
    builder.from(a).next(decider);
    builder.from(decider).on("CONTINUE").to(b).next(c);
    builder.from(decider).on("*").to(c);
    return builder.build().build();

并且上面提到的代码正如我预期的那样工作。但我不确定这是否是正确的做法。基本上我期待一种不重复步骤C执行的方法。

我确实遇到过SimpleAsyncTaskExecutor,但我知道它用于需要进行并行处理的场景中,在我的情况下,如果条件满足,我只需要执行一个步骤。

我的问题是 1.我可以通过使用SimpleAsyncTaskExecutor实现我想要的吗?是否有使用注释使用SimpleAsyncTaskExecutor的示例? 2.还有其他更好的方法可以做我已经做过的事情,我可以避免上述重复吗?

非常感谢任何帮助!

提前致谢, Dhinesh Kumar P

1 个答案:

答案 0 :(得分:0)

我不确定您的代码是如何正常工作的 - 因为在我看来builder.from(decider).on("*").to(c);会为步骤C创建重复执行。

在STEP - A完成执行(无论处于什么状态)后,调用decider并且如果decider返回CONTINUE - 则执行STEP-B然后执行STEP-C。如果该决策器没有返回CONTINUE,则仍然执行STEP-C,因为它不是有条件的 - builder.from(decider).on("CONTINUE").to(b).next(c);

所以STEP-C已经执行,然后再次调用decider并按行 - builder.from(decider).on("*").to(c);再次执行STEP-C。您还必须注意到final StepExecution stepExecution参数在此时调用decider时将是步骤C&不是STEP - B.

如果我误解了任何事情,请告诉我。

此外 - SimpleAsyncTaskExecutor并不意味着建立工作流程。当您尝试并行执行块或尝试并行执行分区步骤时,其目的是在您的作业中引入多线程/并行处理。