2017-05-29 194 views
1

試圖找到這是否曾被問過,但不能。春季批量單線程讀取器和多線程寫入器

這是問題所在。必須通過Spring批處理實現以下功能 有一個文件需要讀取和處理。物品閱讀器不是線程安全的。 該計劃是讓多線程同質處理器和多線程同質作家注入由單線程讀取器讀取的項目。沒有正在執行

 ----------> Processor #1 ----------> Writer #1 
     | 
    Reader -------> Processor #2 ----------> Writer #2 
     | 
     ----------> Processor #3 ----------> Writer #3 

試過AsyncItemProcessor和AsyncItemWriter,但保持對處理器調試點導致讀取器直到點被釋放,即單線程處理:

的像下面類。

任務執行受審象下面這樣:

<tasklet task-executor="taskExecutor" throttle-limit="20"> 

對讀者的多個線程進行啓動。

同步閱讀器也不起作用。

我試圖閱讀關於分區器,但它似乎很複雜。

是否有註釋將讀者標記爲單線程?將閱讀數據推向全球背景是一個好主意嗎?

請指導解決方案。

+0

爲什麼分區過於複雜? –

+0

感謝您的評論。 我剛看了幾分鐘,讀得越多,就越是感到困惑。 我已經歷了它的端到端,它似乎並不是我的問題的傳統解決方案,因爲我不想分割我的輸入。 我錯了嗎? – Programmer

+0

是SynchronizedItemReader的最佳解決方案嗎? – Programmer

回答

0

我想沒有什麼是在您正在尋找的模式的Spring Batch API中內置的。您需要編寫代碼來實現您正在尋找的內容。

Method ItemWriter.write已經需要根據您的塊大小,以便您可以劃分是List到儘可能多的線程,只要你喜歡處理項目的List。您生成自己的線程並將一段列表傳遞給每個線程來寫入。

問題與method ItemProcesor.process(),因爲它逐項處理,所以你是由一個單一的項目限制,你將無法一個單一的項目很多的線程。

因此,挑戰是編寫自己的閱讀器,而不是將一個項目列表交給處理器,而不是單個項目,因此您可以並行處理這些項目。&編寫器將在列表中工作。

在所有這些設置中,您都必須記住,由您產生的線程將超出read-process-寫入Spring批處理的事務邊界,因此您必須自行處理這一點 - 從合併所有線程的處理輸出並等待所有線程完成並處理任何錯誤。總而言之,它非常危險。

Making a item reader to return a list instead single object - Spring batch

0

跨越此之前手頭有類似的問題。

以下是我目前的工作方式。正如@mminella所建議的,與flatfileItemReader同步的itemReader作爲委託。這與體面的表現一起工作。該代碼目前每秒鐘可以寫約4K記錄,但速度並不完全取決於設計,其他屬性也有所貢獻。


試過其他方法來提高性能,兩種都失敗了。

  1. 自定義同步的ItemReader與FlatFileItemReader作爲委託進行聚合,但最終導致保持了很多導致性能下降的狀態。也許代碼需要優化或者同步速度更快。
  2. 解決了每個插入PreparedStatement批處理在不同的線程,但沒有增加太多的性能,但我仍然指望在這種情況下,我碰到一個環境中,批處理的個別線程會導致顯着的性能提升。