我創建了一個彈簧批處理作業,讀取平面CSV文件的塊(提交級別= 10)並將輸出寫入另一個平面文件。乾淨利落。 爲了測試本地擴展,我還使用一個包含10個線程池的TaskExecutor配置了該任務,從而通過使用多線程步驟模式引入了並行性。 正如預期的那樣,這些線程同時讀取項目,直到它們的塊被填充並且塊被寫入輸出文件。 也如預期的那樣,由於這種併發讀取,項目的順序已經改變。 但是有可能保持固定順序,最好還是利用通過使用多線程獲得的性能提升?彈簧批量多線程作業與固定訂單
回答
我想不出一個簡單的方法。解決方法是在讀取時按順序創建的所有行加上前綴。完成作業後,按id排序行。聽起來很不舒服,但應該工作。
我無法看到如何使用ID前綴項目以在併發閱讀期間維持順序。用ID前綴項目意味着連續閱讀imo? – nkr1pt
很明顯,讀者線程必須使用相同的共享計數器實例。類似於['AtomicLong.incrementAndGet()'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicLong.html#incrementAndGet%28%29),其中所有線程共享一個AtomicLong實例。 –
我不認爲有什麼簡單的解決方案,但只使用一個寫線程(也進行排序寫入時)和多線程讀取可以工作,但它不會是可擴展的..
這意味着首先應該按照Sean Patrick Floyd的建議爲它們加上一個ID作爲前綴,以便我們稍後可以在寫入之前在內存中對它們進行排序。但是因爲這些項目是同時讀取的,所以我們不能在閱讀時提供訂單,這應該在一個順序過程中完成? – nkr1pt
- 1. 單元測試彈簧批量作業
- 2. 彈簧啓動應用與彈簧批量不運行作業
- 3. 彈簧批次多步作業和線程分配說明
- 4. 在彈簧批處理作業中使用多線程步驟
- 5. 彈簧批量並行作業縮放
- 6. 重新加載彈簧批量作業
- 7. 多個彈簧批處理作業
- 8. 多線程Lucene索引作家與彈簧批
- 9. JDBC使用彈簧批處理作業
- 10. 使用持久訂閱服務器的彈簧批量分區作業
- 11. 彈簧啓動彈簧批量分配作業在完成後不停止
- 12. 從春季批次訪問遠程彈簧批量作業管理員
- 13. IndexOutOfBoundsException彈簧批量和彈簧啓動
- 14. 彈簧批量彈簧數據
- 15. 使用彈簧安全與彈簧批
- 16. 務實或通過xml創建x個彈簧批量作業
- 17. 長時間運行彈簧批量作業中的TransactionSystemException
- 18. 如何配置彈簧批量作業模塊化?
- 19. 啓動時彈簧批量集成作業實例已存在
- 20. 如何停止和恢復彈簧批量作業
- 21. 即使步驟完成,彈簧批量作業也會失敗
- 22. 具有多個作業和xml文件的彈簧批處理
- 23. 如何使用彈簧批次運行多個作業
- 24. 多彈簧與彈簧JPA
- 25. 檢索彈簧批處理作業bean定義
- 26. 彈簧批量策略
- 27. 彈簧批量流/分流
- 28. 彈簧一批集成1.2.2與彈簧一批不兼容2.2.2
- 29. 在彈簧引導應用程序中調度多個批處理作業
- 30. 彈簧調度給定的作業
嗨,我有同樣的問題。我分別爲讀寫器使用了FlatFileItemReader和FlatFileItemWriter。但兩者都不是線程安全的。我曾嘗試使用TaskExecutor,但重做並不合適。行和列的順序不正確。你可以請你發佈你的解決方案。我指的是您使用的讀寫器,以及用於寫操作順序的破解。 – Saurabh
嗨@ nkr1pt你能幫忙嗎? – Saurabh