2014-04-29 44 views
5

我已經爲一個步驟實現了spring批處理分區,其中一個主步將其工作委派給多個並行執行的slave線程。如下圖所示(參考文獻Spring docsenter image description here 現在如果我有多個要並行執行的步驟?如何在批處理配置中配置它們?我現在的配置是彈簧批量並行分割多個步驟?

<batch:job id="myJob" restartable="true" job-repository="jobRepository" > 
     <batch:listeners> 
      <batch:listener ref="myJoblistener"></batch:listener> 
     </batch:listeners> 

     <batch:step id="my-master-step"> 
      <batch:partition step="my-step" partitioner="my-step-partitioner" handler="my-partitioner-handler"> 
      </batch:partition> 
     </batch:step> 
    </batch:job> 

    <batch:step id="my-step" > 
     <batch:tasklet ref="myTasklet" transaction-manager="transactionManager" > 
     </batch:tasklet> 
     <batch:listeners> 
      <batch:listener ref="myStepListener"></batch:listener> 
     </batch:listeners> 
    </batch:step> 

我的體系結構圖應該像下面的圖片: enter image description here

我不知道,即使它可能使用彈簧batch.Any的想法或我的方式在我頭上來實現謝謝。

+0

你好,看到這個帖子裏面概述瞭如何使用流和分流ELEM元素解決了這個問題。我正在嘗試與你完全一樣,但仍然堅持下去。 http://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch – emeraldjava

+0

這是我發現與這個主題相關的第二篇文章。 http://forum.spring.io/forum/spring-projects/batch/80527-defining-a-flow-inside-a-partitionstep – emeraldjava

+0

我有一個類似的問題,請看看http://stackoverflow.com/questions/33121176/spring-batch-flowste-in-partitioner-restart-issue/33125360#33125360 – mremond

回答

3

您可以嘗試以下操作。

<batch:job id="myJob" restartable="true" job-repository="jobRepository" > 
     <batch:listeners> 
      <batch:listener ref="myJoblistener"></batch:listener> 
     </batch:listeners> 

     <batch:step id="my-master-step"> 
      <batch:partition step="my-step" partitioner="my-step-partitioner" handler="my-partitioner-handler"> 
      </batch:partition> 
     </batch:step> 
    </batch:job> 

    <batch:step id="my-step" > 
     <batch:job ref="MyChildJob" job-launcher="jobLauncher" 
       job-parameters-extractor="jobParametersExtractor" /> 
     <batch:listeners> 
      <batch:listener ref="myStepListener"></batch:listener> 
     </batch:listeners> 
    </batch:step> 

    <batch:job id="MyChildJob" restartable="false" 
     xmlns="http://www.springframework.org/schema/batch"> 
     <batch:step id="MyChildStep1" next="MyChildStep2"> 
      <batch:tasklet ref="MyChildStep1Tasklet" transaction-manager="transactionManager" > 
      </batch:tasklet> 
     </batch:step> 

     <batch:step id="MyChildStep2" next="MyChildStep3"> 
      <batch:tasklet ref="MyChildStep2Tasklet" transaction-manager="transactionManager" > 
      </batch:tasklet> 
     </batch:step> 

     <batch:step id="MyChildStep3"> 
      <batch:tasklet ref="MyChildStep3Tasklet" transaction-manager="transactionManager" > 
      </batch:tasklet> 
     </batch:step> 

    </batch:job> 
+0

我不認爲它會起作用......通過在你的配置中看到每個tasklet運行的是不同的工作......這是不可取的..我需要有一個單一的批處理作業與上述行爲..感謝 –

+0

我已配置相同的方式,並在生產中工作正常。如果您不需要它作爲單獨的作業,請將其配置爲流程。流程包含所有三個步驟。 –

+0

Hi @ DanglingPiyush。你解決了你的問題。我有同樣的要求。你能幫我嗎 – pppavan

-1

我有類似的要求和使用要求,下面

<batch:job id="cycleJob"> 
     <batch:step id="zStep" next="gStep"> 
      <batch:partition partitioner="zPartitioner"> 
       <batch:step> 
        <batch:tasklet throttle-limit="1"> 
         <batch:chunk processor="itemProcessor" reader="zReader" writer="itemWriter" commit-interval="1"> 
         </batch:chunk> 
        </batch:tasklet> 
       </batch:step> 
       <batch:handler task-executor="taskExecutor" grid-size="${maxThreads}" /> 
      </batch:partition> 
     </batch:step> 
     <batch:step id="gStep" parent="zStep" next="yStep"> 
      <batch:partition partitioner="gPartitioner"> 
       <batch:step> 
        <batch:tasklet throttle-limit="1"> 
         <batch:chunk processor="itemProcessor" reader="gReader" writer="itemWriter" commit-interval="1"> 
         </batch:chunk> 
        </batch:tasklet> 
       </batch:step> 
       <batch:handler task-executor="taskExecutor" grid-size="${maxThreads}" /> 
      </batch:partition> 
     </batch:step> 
</batch:job>