這是一個關于在運行時更改執行緒池大小如何影響彈簧批處理運行時系統的復合問題。
首先,我想澄清一下:并發 = # 運行步驟數和并行度 = 每步驟 # 執行緒數。
為了清楚地了解我如何使用 Spring Batch 進行處理。目前我正在生成大量檔案(200 ),我正在使用 Spring Batch 傳輸每個步驟映射到 1 個檔案的檔案。關于作業的一切都是動態的,就像步驟數一樣,每個步驟的讀取器和寫入器都與該步驟不同。所以沒有步驟共享讀者或作者。有一個執行緒池專門用于并發運行這些步驟,然后每個步驟都有自己的執行緒池,因此我們可以在每個步驟中進行并行處理。當與提交間隔結合使用時,這提供了巨大的吞吐量和控制。
所以我的問題是:
- 作業開始后如何更改運行步驟數?
- 如何在步驟開始處理后更改提交間隔?
因此,讓我們考慮一個示例,說明我為什么要這樣做以及更改“運行步驟”和“提交間隔”的確切含義。
考慮一下您總共有 300 個步驟要處理的情況,步驟執行緒池大小為 5。我開始處理并意識到我有更多資源可以利用,我想將執行緒數更改為 8。當我實際執行此操作時在運行時,我的經驗是執行緒池確實增加了,但運行步驟的數量沒有改變。這是為什么?
按照類似的邏輯說我有更多的記憶體可以利用,然后我想在運行時增加我的提交間隔。我在 StepExecution 類中沒有發現任何可以讓我出人意料地更改提交間隔的東西。為什么不?
有趣的是,對于并行性,我可以通過簡單地增加執行緒池的大小來改變運行執行緒的數量。通過簡單地更改并行執行緒的數量,我注意到吞吐量大幅增加。
如果您想了解更多資訊,我可以提供代碼并鏈接到存盤庫。
非常感謝。
uj5u.com熱心網友回復:
雖然可以使提交間隔和執行緒池大小可配置并在啟動時更改它們,但一旦作業執行開始,就無法在運行時(即“運行中”)更改它們。
使提交間隔和執行緒池大小可配置(通過應用程式/系統屬性或將它們作為作業引數傳遞)將允許您根據經驗調整值以最好地利用您的資源,而無需重新編譯/重新打包您的應用程式。
您正在尋找的運行時動態默認情況下不可用,但您始終可以實作該Step
介面并將其用作 Spring Batch 作業的一部分,旁邊是框架提供的開箱即用的其他步驟型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491166.html
上一篇:關于執行緒間資料交換的問題