天道不一定酬所有勤
但是,天道只酬勤

SpringBatch配置多線程step

SpringBatch批處理框架默認使用單線程完成任務的執行,但是他提供了對線程池的支持。使用tasklet的task-executor屬性可以很容易的將普通的step轉成多線程的step。

task-executor:任務執行處理器,定義后采用多線程執行任務,需要考慮線程安全問題。 throttle-limit:最大使用線程池數目。

如果我們希望示例中的 billingStep 以并發方式執行,且并發任務數為 5,那么只需要做如下配置即可,見清單:

<step id="billingStep" next="payStep">
    <tasklet task-executor="taskExecutor" throttle-limit="5">
        <chunk reader="userDbReader" processor="billingProcessor"
        writer="billDbWriter" commit-interval="5" chunk-completion-policy="">
        </chunk>
    </tasklet>
</step>
<beans:bean id="taskExecutor"
    class="org.springframework.core.task.SimpleAsyncTaskExecutor">
</beans:bean>

Spring Core 為我們提供了多種執行器實現(包括多種異步執行器),我們可以根據實際情況靈活選擇使用。

類名 描述 是否異步
SyncTaskExecutor 簡單同步執行器
ThrottledTaskExecutor 該執行器為其他任意執行器的裝飾類,并完成提供執行次數限制的功能 視被裝飾的執行器而定
SimpleAsyncTaskExecutor 簡單異步執行器,提供了一種最基本的異步執行實現
WorkManagerTaskExecutor 該類作為通過 JCA 規范進行任務執行的實現,其包含 JBossWorkManagerTaskExecutor 和 GlassFishWorkManagerTaskExecutor 兩個子類
ThreadPoolTaskExecutor 線程池任務執行器

在多線程step中為了保證代碼處理的正確性,要求所有在多線程step中處理的對象和操作必須都是線程安全的。但是SpringBatch框架提供的大部分的ItemReader、ItemWriter都不是線程安全的。所以需要自己保證多線程處理時候的線程安全。

那么,如何保證step的線程安全呢?

1.對reader的read方法使用synchronized關鍵字。

這種方式并不支持重啟操作。當執行失敗的時候并沒有保存當前的狀態數據導致無法知道哪些數據已經讀取,哪些數據未讀取。

多線程step提供了多個線程執行一個step的能力,但這種場景在實際業務中是用的并不是非常多。更多的是job中不同的step沒有先后順序,可以在執行期間并行的執行。SpringBatch提供了并行step的能力??梢酝ㄟ^split元素來定義并行的作業流。

參考資料:使用 Spring Batch 構建企業級批處理應用: 第 2 部分

(全文完) 歡迎關注『Java之道』微信公眾號
贊(4)
如未加特殊說明,此網站文章均為原創,轉載必須注明出處。HollisChuang's Blog » SpringBatch配置多線程step
分享到: 更多 (0)

評論 搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

HollisChuang's Blog

聯系我關于我
网上设计赚钱的网站有哪些