2015-09-02 29 views
1

我已经扩展了FlowJob类和我设置的流程如下:。混合串行和并行步骤的处理

final Flow subflow1 = new FlowBuilder<Flow>("subflow1") 
    .start(new StepBuilder("SubFlow1-step") 
      .chunk(1000) 
      .reader(reader) 
      .writer(writer) 
      .repository(jobRepository) 
      .transactionManager(txManager).build()) 
    .end(); 
final Flow subflow2 = new FlowBuilder<Flow>("subflow2") 
    .start(new StepBuilder("SubFlow2-step") 
      .chunk(1000) 
      .reader(reader) 
      .writer(writer) 
      .taskExecutor(new SimpleAsyncTaskExecutor()) 
      .repository(jobRepository) 
      .transactionManager(txManager).build()) 
    .end(); 

setFlow(new FlowBuilder<Flow>("Flow") 
      .start(new StepBuilder("Flow-step1") 
        .chunk(10000) 
        .reader(reader) 
        .writer(writer) 
        .repository(jobRepository) 
        .transactionManager(txManager).build()) 
      .next(new StepBuilder("Flow-step2") 
        .tasklet(processor) 
        .repository(jobRepository) 
        .transactionManager(txManager).build()) 
      .split(new SimpleAsyncTaskExecutor()) 
      .add(subflow1, subflow2) 
      .end()); 

正如你所看到的,我想要做的是:

  1. 执行步骤1
  2. 执行步骤2
  3. 同时执行subflow1和subflow2。 subflow1步骤将按顺序执行。 subflow2步骤将并行执行(分派到可用线程的块)。

当我运行我的作业时,步骤1和2被正确执行,然后作业终止。

有什么想法?

编辑:关于SO Spring-batch flow/split after a step的相关问题。

+0

请参阅http://stackoverflow.com/questions/21782008/how-to-terminate-step-弹簧内批量拆分流程与决策者 –

回答

2

我相信有一个bug记录了这个。目前的解决方法是用您的分割创建流程并将流程添加到作业中,如下所示:

@Bean 
public Job splitJob(@Qualifier("foo") Flow foo, @Qualifier("foo") Flow bar) { 
    FlowBuilder<Flow> flowBuilder = new FlowBuilder<>("split"); 

    Flow flow = flowBuilder.split(new SimpleAsyncTaskExecutor()) 
      .add(foo, bar) 
      .end(); 

    return jobBuilderFactory.get("splitJob") 
      .start(myStep1()) 
      .next(myStep2()) 
      .on("COMPLETED").to(flow) 
      .end() 
      .build(); 
} 
+0

我终于不需要使用拆分功能。我正在使用分区功能。希望这会帮助别人!谢谢 –