一步后弹簧批流/分流

时间:2013-11-28 14:51:40

标签: java spring concurrency spring-batch

我正在构建包含以下过程的弹簧批解决方案:

第1步:将列表拆分为多个列表  第2步:处理每个子列表  第3步:合并子列表

生成的子列表可以并行处理,并且根据spring-batch文档支持。遗憾的是,我只能找到以并行步骤开始的弹出批处理示例作业,而不是按顺序开始的示例。

以下作业无法编译。 Spring给了我一个错误:'无法解决step2'

<batch:job id="webServiceJob2">
    <batch:step id="step1" next="step2"></batch:step>
    <batch:split id="step2" next="step3"></batch:split>
    <batch:step id="step3"></batch:step>
</batch:job>

那么如何将作业配置为首先运行单个步骤,而不是并行运行多个步骤,然后运行最后一步?

3 个答案:

答案 0 :(得分:2)

我偶然发现了这个问题,询问分裂是如何运作的,也许这个答案迟到了一年(一年),但我来了......

存在“分裂”的问题本身并不是一个步骤,而是您按原样命名(并引用)它:

<batch:job id="webServiceJob2">
    <batch:step id="step1" next="step2"></batch:step>
    <batch:split id="step2" next="step3"></batch:split> <!-- This is not a step -->
    <batch:step id="step3"></batch:step>
</batch:job>

正确的语法是:

<batch:job id="webServiceJob2">
    <batch:step id="step1" next="step2"></batch:step>
    <batch:split id="split_step2" next="step3">
        <flow> 
             <step id="step2_A_1" ... next="step2_A_2"/>
             <step id="step2_A_2" ... />
        </flow>
        <flow> 
             <step id="step2_B_1" ... />
        </flow>
    </batch:split>
    <batch:step id="step3"></batch:step>
</batch:job>

但这不是你想要实现的,因为通过split声明你必须在编译时设置将要执行的并行步骤的确切数量,并且split的目的是在每个步骤中使用不同的步骤而是多次调用同一个。

您应该查看有关Scaling and Parallel processes的文档,分区步骤似乎是您的要求的合适人选。

答案 1 :(得分:0)

并行步骤将指示每个子列表的不同步骤,我认为这不是您想要的 单Multi-threaded Step似乎更合适 如文档所述,首先定义一个TaskExecutor bean,它将在一个单独的线程中处理每个。由于TaskExecutors使用起来相当简单,您也可以自己调用TaskExecutor。在这种情况下,您的步骤可以是多线程的,而Spring Batch无需了解它。

答案 2 :(得分:0)

当然,你可以在工作中分开!以下是Spring Batch In Action(2012)中的示例。

<batch:job id="importProductsJob">
  <batch:step id="decompress" next="readWrite">
    <batch:tasklet ref="decompressTasklet"/>
  </batch:step>
  <batch:split id="readWrite" next="moveProcessedFiles">
    <batch:flow>
      <batch:step id="readWriteBookProduct"/>
    </batch:flow>
    <batch:flow>
      <batch:step id="readWriteMobileProduct"/>
    </batch:flow>
  </batch:split>
  <batch:step id="moveProcessedFiles">
    <batch:tasklet ref="moveProcessedFilesTasklet" />
  </batch:step>
</batch:job>