【问题标题】:Spring Batch 3.0.2 Parallel Steps using AnnotationsSpring Batch 3.0.2 使用注释的并行步骤
【发布时间】:2015-04-09 19:02:18
【问题描述】:

我正在使用 SpringBatch 3.0.2 并尝试创建一个作业,该作业使用带有注释的 JavaConfig 样式和 JobBuilderFactory 类来执行一系列步骤(其中一些是并行的)。我想要发生的是从 step1 开始,当它完成时过渡到 step2a、step2b、step2c 和 step2d,它们都并行运行。当所有这些步骤完成后,它应该过渡到第 3 步。我正在为创建此工作所需的语法而苦苦挣扎

@Bean(name = "SplitFlowJob4")
 public Job splitFlowJob4() throws SQLException
  {
    final Flow flow2b = new FlowBuilder<Flow>("subflow2b").from(step2b()).end();
    final Flow flow2c = new FlowBuilder<Flow>("subflow2c").from(step2c()).end();
    final Flow flow2d = new FlowBuilder<Flow>("subflow2d").from(step2d()).end();

    return jobs.get("SplitFlowJob4").start(step1()).next(step2a()).split(new SimpleAsyncTaskExecutor())
        .add(flow2b, flow2c, flow2d).next(step3()).end().build();
  }

这不符合我的预期。这仅执行 step1 和 step2a。我没有看到 step2b、2c、2d 或 step3。

    [INFO ] [main] 2015-02-09 15:28:32,169 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep1]
    [INFO ] [main] 2015-02-09 15:28:32,194 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep2a]

如果我更改语法并从 step1 调用 split,那么 step1、2a、2b、2c、2d 将全部并行执行,而不仅仅是步骤 2a、2b、2c、2d。

  @Bean(name = "SplitFlowJob5")
  public Job splitFlowJob5() throws SQLException
  {
    final Flow flow2a = new FlowBuilder<Flow>("subflow2a").from(step2a()).end();
    final Flow flow2b = new FlowBuilder<Flow>("subflow2b").from(step2b()).end();
    final Flow flow2c = new FlowBuilder<Flow>("subflow2c").from(step2c()).end();
    final Flow flow2d = new FlowBuilder<Flow>("subflow2d").from(step2d()).end();

    return jobs.get("SplitFlowJob5").start(step1()).split(new SimpleAsyncTaskExecutor())
        .add(flow2a, flow2b, flow2c, flow2d).next(step3()).end().build();
  }

这会并行执行 Step1、step2a、step2b、step2c、step2d。

    [INFO ] [SimpleAsyncTaskExecutor-2] 2015-02-09 16:28:36,507 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep2b]
    [INFO ] [SimpleAsyncTaskExecutor-5] 2015-02-09 16:28:36,513 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep1]
    [INFO ] [SimpleAsyncTaskExecutor-3] 2015-02-09 16:28:36,512 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep2c]
    [INFO ] [SimpleAsyncTaskExecutor-4] 2015-02-09 16:28:36,509 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep2d]
    [INFO ] [SimpleAsyncTaskExecutor-1] 2015-02-09 16:28:36,507 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep2a]
    [INFO ] [main] 2015-02-09 16:28:36,615 org.springframework.batch.core.job.SimpleStepHandler - Executing step: [SplitFlowJobStep3]

我不确定我做错了什么,是否可以使用 fluent builder api 创建这样的工作?我见过其他以拆分开头或结尾的工作示例,但我还没有看到在工作中间包含拆分的示例。

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    Spring Batch 的 java 配置中存在一个带有拆分的错误,该错误已在上周晚些时候修复 (BATCH-2346)。那里的修复解决了阻止执行列表中的第一个流程的错误以及有关如何解决这个用例的文档修复。

    简而言之,以下代码应该适用于最新代码:

    @Bean(name = "SplitFlowJob5")
    public Job splitFlowJob5() throws SQLException
    {
        final Flow flow2a = new FlowBuilder<Flow>("subflow2a").from(step2a()).end();
        final Flow flow2b = new FlowBuilder<Flow>("subflow2b").from(step2b()).end();
        final Flow flow2c = new FlowBuilder<Flow>("subflow2c").from(step2c()).end();
        final Flow flow2d = new FlowBuilder<Flow>("subflow2d").from(step2d()).end();
    
        final Flow splitFlow = new FlowBuilder<Flow>("splitFlow")
            .start(flow2a)
            .split(new SimpleAsyncTaskExecutor())
            .add(flow2b, flow2c, flow2d).build();
    
        return jobs.get("SplitFlowJob5").start(step1())
           .next(splitFlow).next(step3()).end().build();
    }
    

    【讨论】:

    • 这解决了我的问题。我将我的 gradle 依赖项更新为 3.1.0.BUILD-SNAPSHOT 版本。我确实不得不稍微改变语法,因为第一次调用 next() 需要一个 Step 而不是 Flow。我没有将 Step 传递给 start(),而是为 Step1 创建了一个 Flow 并将其传递给 start()。我不知道是否有更好的方法可以做到这一点,但它对我有用。
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2018-06-20
    • 1970-01-01
    • 2020-11-21
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多