Spring-batch flow / split after a step

后端 未结 3 1685
花落未央
花落未央 2021-01-12 10:29

I am building a spring-batch solution that contains the following process:

step 1 : split a list into multiple lists step 2 : process each sub-list step 3 : merge

相关标签:
3条回答
  • 2021-01-12 10:33

    Of course you can have a split in the middle of a job! Here is the example from 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>
    
    0 讨论(0)
  • 2021-01-12 10:36

    Parallel steps would indicate a different step for each sub-list, which I don't think is what you want.
    A single Multi-threaded Step seems more appropriate.
    As documented, you start by defining a TaskExecutor bean, which will process each chunk in a separate thread. Since TaskExecutors are fairly simple to use, you could also invoke the TaskExecutor on your own. In this case, your step can be multi-threaded without Spring Batch needing to know about it.

    0 讨论(0)
  • 2021-01-12 10:41

    I've stumbled upon this question asking about how split works, and maybe this answer arrives a bit (one year) late, but here I go...

    The issue there is "split" is not a step by itself, but you were naming (and referencing) it as it was:

    <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>
    

    The correct syntax would be:

    <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>
    

    But this is not what you want to achieve, because by split declarations you have to set in compile time the exact number of parallel steps that will be executed, and the purpose of split is using different steps in each flow instead calling several times the same one.

    You should check the documentation about Scaling and Parallel processes, the partition step seems a good candidate for your requirements.

    0 讨论(0)
提交回复
热议问题