Spring batch Spring Batch 3.0.2使用注释的并行步骤

Spring batch Spring Batch 3.0.2使用注释的并行步骤,spring-batch,Spring Batch,我正在使用Springbatch3.0.2,并尝试创建一个作业,该作业使用带有注释和类的JavaConfig样式执行一系列步骤(其中一些是并行的)。我想做的是从步骤1开始,完成后过渡到步骤2a、步骤2b、步骤2c和步骤2d,它们都是并行运行的。当所有这些步骤完成后,它应该过渡到步骤3。我正在努力学习创建此作业所需的语法 @Bean(name = "SplitFlowJob4") public Job splitFlowJob4() throws SQLException { fin

我正在使用Springbatch3.0.2,并尝试创建一个作业,该作业使用带有注释和类的JavaConfig样式执行一系列步骤(其中一些是并行的)。我想做的是从步骤1开始,完成后过渡到步骤2a、步骤2b、步骤2c和步骤2d,它们都是并行运行的。当所有这些步骤完成后,它应该过渡到步骤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();
  }
如果我更改语法并从步骤1调用split,那么步骤1、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();
  }

我不确定我做错了什么,是否可以使用fluent builder api创建这样的作业?我看到了其他工作例子,这些例子是以分裂开始或结束的,但我没有看到其中包含一个在工作中间的分裂。

< P>在Spring Palm的java配置中有一个bug,其中的配置是在上个星期(上)固定的。这里的修复既解决了阻止执行列表中第一个流的bug,也解决了关于如何解决这个用例的文档修复

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

@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();
}
@Bean(name=“SplitFlowJob5”)
公共作业splitFlowJob5()引发SQLException
{
最终流量flow2a=新的FlowBuilder(“子流量2a”)。从(步骤2a())开始。结束();
最终流量flow2b=新的流量生成器(“子流量2b”)。从(步骤2b())。结束();
最终流flow2c=新的FlowBuilder(“子流2C”)。来自(步骤2C())。结束();
最终流flow2d=新的FlowBuilder(“子流2D”)。从(step2d()).end();
最终流量拆分流量=新流量生成器(“拆分流量”)
.启动(流程2a)
.split(新的SimpleAsyncTaskExecutor())
.add(flow2b、flow2c、flow2d).build();
return jobs.get(“SplitFlowJob5”).start(step1())
.next(splitFlow).next(step3()).end().build();
}

Spring Batch的java配置中有一个错误,上周晚些时候修复了该错误()。这里的修复既解决了阻止执行列表中第一个流的bug,也解决了关于如何解决这个用例的文档修复

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

@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();
}
@Bean(name=“SplitFlowJob5”)
公共作业splitFlowJob5()引发SQLException
{
最终流量flow2a=新的FlowBuilder(“子流量2a”)。从(步骤2a())开始。结束();
最终流量flow2b=新的流量生成器(“子流量2b”)。从(步骤2b())。结束();
最终流flow2c=新的FlowBuilder(“子流2C”)。来自(步骤2C())。结束();
最终流flow2d=新的FlowBuilder(“子流2D”)。从(step2d()).end();
最终流量拆分流量=新流量生成器(“拆分流量”)
.启动(流程2a)
.split(新的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()的第一次调用需要一个步骤,而不是一个流。我没有将步骤传递给start(),而是为步骤1创建了一个流,并将其传递给start()。我不知道是否有更好的方法可以做到这一点,但它对我很有效。这为我解决了问题。我将gradle依赖项更新为3.1.0.BUILD-SNAPSHOT版本。我确实需要稍微修改语法,因为对next()的第一次调用需要一个步骤,而不是一个流。我没有将步骤传递给start(),而是为步骤1创建了一个流,并将其传递给start()。我不知道是否有更好的方法可以做到这一点,但它对我很有效。
@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();
}