代码之家  ›  专栏  ›  技术社区  ›  manash

混合顺序和并行步骤处理

  •  1
  • manash  · 技术社区  · 9 年前

    我已经扩展了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 .

    1 回复  |  直到 7 年前
        1
  •  3
  •   Michael Minella    9 年前

    我相信这是一个错误记录。目前的解决方法是使用拆分创建流,并将流添加到作业中,如下所示:

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