spring 批量条件 if 步骤

spring batch conditional if step

Spring 批处理文档很好地解释了如何使用以下模式的步骤正确定义作业:

call Step 1
if (some condition determined by a Decider) {
  call Step 2
} ELSE {
  call Step 3
}

但是,我正在尝试在 Java 配置中实现此目的:

call Step 1
if (some condition determined by a decider) {
 call step 2
}
call step 3
call step 4
.. so on and so forth ..

而且我认为我可能误读了 API 因为我似乎无法让条件 IF 逻辑按预期运行 - 所有发生的事情都是当决策程序评估为 True 它运行第 2 步,但从不运行第 3 步 .. 当然,当决策者评估为 false 时,它​​只运行第 3 步。有人有任何示例说明如何在 Java 配置中执行此类条件步骤吗?

你应该定义你的决策者,因为你有两个选择。 实现 JobExecutionDecider 或定义 bean 的 class,如上例所示:

@Bean
public JobExecutionDecider decider() {
    return (JobExecution jobExecution, StepExecution stepExecution) -> {
        // write code here
        boolean someCondition = true;
        return someCondition ? new FlowExecutionStatus("COMPLETED") : new FlowExecutionStatus("FAILED");
    };
}

之后,您可以像这样使用此决策程序定义流程:

@Bean
public Job job() {
    return jobBuilderFactory.get("job").incrementer(new RunIdIncrementer()).start(step1()).next(decider())
            .on("COMPLETED").to(step2()).from(decider()).on("FAILED").to(step3()).end().build();
}

带有步骤的作业的完整定义应如下所示:

@Configuration
public class MJob {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job").incrementer(new RunIdIncrementer()).start(step1()).next(decider())
                .on("COMPLETED").to(step2()).from(decider()).on("FAILED").to(step3()).end().build();
    }

    @Bean
    public JobExecutionDecider decider() {
        return (JobExecution jobExecution, StepExecution stepExecution) -> {
            // write code here
            boolean someCondition = true;
            return someCondition ? new FlowExecutionStatus("COMPLETED") : new FlowExecutionStatus("FAILED");
        };
    }

    public Step step1() {
        return stepBuilderFactory.get("step1").tasklet(new Step1()).build();
    }

    public Step step2() {
        return stepBuilderFactory.get("step2").tasklet(new Step2()).build();
    }

    public Step step3() {
        return stepBuilderFactory.get("step3").tasklet(new Step3()).build();
    }

}

这是否回答了您的问题?