首页 > 解决方案 > 如何在春季批处理中的另一个流中定义并行子流?

问题描述

我想在 Spring Batch 中实现如下的流程结构。

           Job
          /   \
       Flow1  Flow2  
         /      \
      Step1    Step2
        /       /  \
       /    Step3  Flow3
      /                \  
     /                 Step4
     \                  /
      \                /
       \              /    
            Step5    

作业配置伪代码如下:

@Configuration
public class JobConfiguration {

......

    @Bean
    public Job Job() {

    Flow flow1 = new FlowBuilder<SimpleFlow>("flow1")
                            .start(step1())
                            .build();

    Flow flow2 = new FlowBuilder<SimpleFlow>("flow2")
           .start(step2())
           .next(step3())
           .split(new SimpleAsyncTaskExecutor()).add(flow3)
           .build();

    Flow flow3 = new FlowBuilder<SimpleFlow>("flow3")
                            .start(step4())
                            .build();

    return jobBuilderFactory.get("job")
            .incrementer(new RunIdIncrementer())
            .start(flow1)
            .split(new SimpleAsyncTaskExecutor()).add(flow2)
            .next(Step5())
            .end()
            .build();
    }
......
}

当我运行批处理时,日志显示执行了 step1、step2、step3 和 step5,但没有运行 step4。

我想知道如何在另一个流程中定义子流程,上面的代码是实现它的正确方法吗?

提前致谢!

标签: spring-batch

解决方案


单独运行每个流程表明这是正确的,但Flow1不是。仅运行:Flow3Flow2Flow2

    return jobBuilderFactory.get("job")
            .incrementer(new RunIdIncrementer())
            .start(flow2)
            .build()
            .build();

显示执行了 step2 和 step3,但没有执行 step4。所以问题在于这个流程的定义。

您需要定义 and 之间的并行流Step3Flow3就像您对Flow1and所做的那样Flow2。这是一个例子:

@Bean
public Job Job() {

    Flow flow1 = new FlowBuilder<SimpleFlow>("flow1")
            .start(step1())
            .build();

    Flow flow3 = new FlowBuilder<SimpleFlow>("flow3")
            .start(step4())
            .build();

    Flow parallelFlow = new FlowBuilder<SimpleFlow>("parallelFlow")
            .start(step3())
            .split(new SimpleAsyncTaskExecutor()).add(flow3)
            .build();

    Flow flow2 = new FlowBuilder<SimpleFlow>("flow2")
            .start(step2())
            .next(parallelFlow)
            .build();

    return jobs.get("job")
            .incrementer(new RunIdIncrementer())
            .start(flow1)
            .split(new SimpleAsyncTaskExecutor()).add(flow2)
            .next(step5())
            .end()
            .build();
}

希望这可以帮助。


推荐阅读