Spring批处理3.0.2使用批注的并行步骤
问题描述:
我正在使用SpringBatch 3.0.2并试图创建一个使用带注释的JavaConfig样式和JobBuilderFactory类执行一系列步骤(其中一些并行)的作业。我想要发生的是从step1开始,并在它完成时转换到所有并行运行的step2a,step2b,step2c和step2d。当所有这些步骤完成后,它应该转换到步骤3。我正在努力创造这项工作所需的语法Spring批处理3.0.2使用批注的并行步骤
@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和步骤2a。我没有看到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]
如果我改变的语法和从步骤1调用分裂,然后步骤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();
}
这并行执行步骤1,步骤2a,步骤2b,步骤2c,步骤2d。
[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]
我不知道我在做什么错,是否有可能使用流利的构建器API来创建这样的工作?我已经看到了其他以分裂开始或结束的实例,但我还没有看到一个在工作中包含分裂的例子。
答
上周晚些时候修复的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>
.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。我没有将步骤传递给start(),而是为Step1创建了一个Flow并将其传递给start()。我不知道是否有更好的方法来做到这一点,但它对我有用。 – Randy 2015-02-10 13:58:56