2011-08-19 64 views
2

我創建了一個彈簧批處理作業,讀取平面CSV文件的塊(提交級別= 10)並將輸出寫入另一個平面文件。乾淨利落。 爲了測試本地擴展,我還使用一個包含10個線程池的TaskExecutor配置了該任務,從而通過使用多線程步驟模式引入了並行性。 正如預期的那樣,這些線程同時讀取項目,直到它們的塊被填充並且塊被寫入輸出文件。 也如預期的那樣,由於這種併發讀取,項目的順序已經改變。 但是有可能保持固定順序,最好還是利用通過使用多線程獲得的性能提升?彈簧批量多線程作業與固定訂單

+0

嗨,我有同樣的問題。我分別爲讀寫器使用了FlatFileItemReader和FlatFileItemWriter。但兩者都不是線程安全的。我曾嘗試使用TaskExecutor,但重做並不合適。行和列的順序不正確。你可以請你發佈你的解決方案。我指的是您使用的讀寫器,以及用於寫操作順序的破解。 – Saurabh

+0

嗨@ nkr1pt你能幫忙嗎? – Saurabh

回答

1

我想不出一個簡單的方法。解決方法是在讀取時按順序創建的所有行加上前綴。完成作業後,按id排序行。聽起來很不舒服,但應該工作。

+0

我無法看到如何使用ID前綴項目以在併發閱讀期間維持順序。用ID前綴項目意味着連續閱讀imo? – nkr1pt

+2

很明顯,讀者線程必須使用相同的共享計數器實例。類似於['AtomicLong.incrementAndGet()'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicLong.html#incrementAndGet%28%29),其中所有線程共享一個AtomicLong實例。 –

0

我不認爲有什麼簡單的解決方案,但只使用一個寫線程(也進行排序寫入時)和多線程讀取可以工作,但它不會是可擴展的..

+0

這意味着首先應該按照Sean Patrick Floyd的建議爲它們加上一個ID作爲前綴,以便我們稍後可以在寫入之前在內存中對它們進行排序。但是因爲這些項目是同時讀取的,所以我們不能在閱讀時提供訂單,這應該在一個順序過程中完成? – nkr1pt