2016-07-29 24 views
0

我有奇怪的工作行爲,並不明白爲什麼會發生這種情況。 我具有以下彈簧批量配置:春天批次落實間隔不起作用和奇怪的工作行爲

<beans:bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <beans:property name="corePoolSize" value="50"/> 
    <beans:property name="maxPoolSize" value="100"/> 
    <beans:property name="queueCapacity" value="100"/> 
</beans:bean> 



<job id="creationFlowSaveJob"> 
    <step id="creationFlowCampaignSaveStep"> 
     <tasklet task-executor="taskExecutor" 
       throttle-limit="5"> 
      <chunk 
        reader="creationFlowCampaignSaveReader" 
        processor="creationFlowCampaignSaveProcessor" 
        writer="creationFlowCampaignSaveWriter" 
        commit-interval="100" 
        > 
      </chunk> 
     </tasklet> 
     <listeners> 
      <listener ref="generalStepLogger"/> 
     </listeners> 
    </step> 
</job> 

所以我有步驟與油門限= 5和提交間隔=「100」和我假定作家將接收的100個項目的塊來寫,並且所有組塊將被逐一處理。

但我有以下流程:

如果工作在流4項,然後我看到作家獲得1項,調用4次,有4個項目,而不是單一的時間。 除此之外,所有這4個調用都在同時執行,意思是在同一時間,這很奇怪。

另一個奇怪的事情是,如果我從tasklet配置中刪除task-executor,那麼job會開始像預期的那樣工作。如果項目數量很大,並且沒有併發編寫器調用,那麼要寫入的文件大小爲4或100。

有人可以解釋爲什麼會發生這種情況嗎? 爲什麼taskExecutor以這種奇怪的方式改變作業流程,以及taskExecutor在作業中的目的是什麼?

請大家幫忙理解這一點,謝謝

回答

0

隨着任務的執行和油門限位聲明多線程的一步。所以你有5個線程可以同時讀寫。如果您不需要,請從步驟聲明中刪除task-executor和throttle-limit。
此外,如果你使用多線程,你應該使用線程安全ItemReader和ItemWriter

+0

謝謝,這解釋了很多 –

+0

贊成票和接受答案,請:) – Dmitry

+0

我想才達到的目標是,我將有5閱讀器,5個處理器和1個寫入器 因此,如果我刪除任務執行程序並保留限制,它將工作? 它應該讀取,處理多線程和一旦項目數量等於承諾間隔發送到寫入器 我理解正確嗎? –