[英]Using FlatFileItemReader with a TaskExecutor (Thread Safety)
有很多例子使用FlatFileItemReader
和TaskExecutor
。 我在下面提供了示例(包括XML和Java Config):
我已經將自己的XML配置用於大型CSV(GB大小),使用開箱即用的JpaItemWriter
寫入數據庫。 即使沒有設置save-state = false或采取任何特殊處理,似乎也沒有問題。
現在, FlatFileItemReader
被記錄為不是線程安全的 。
我的猜測是,如果hashCode()
和equals()
覆蓋了實體的業務密鑰, JpaItemWriter
通過持久化集合即“覆蓋”該問題,即沒有重復的集合。 但是,即使這樣,由於非線程安全的讀取和處理,也不足以防止重復。
您能否澄清一下:在已分配TaskExecutor的FlatFileItemReader
中使用開箱即用的FlatFileItemReader
是否正確/正確/安全? 無論作家如何。 如果沒有,我們怎么能在理論上解釋使用JPAItemWriter
時缺少錯誤?
PS:我在上面給出的示例鏈接,使用FlatFileItemReader
和TaskExecutor,但沒有提到所有可能的線程安全問題......
TL; DR如果Writer
是線程安全的,那么使用帶有TaskExecutor
的FlatFileItemReader
是安全的。 (假設您不關心重啟作業,重試步驟,跳過等等)。
更新:現在有一個JIRA正式確認saveState
需要設置為false
(即禁用可重啟性),如果想要以線程安全的方式使用FlatFileItemReader
和TaskExecutor
。
讓我們首先通過查看Spring文檔中有關使用TaskExecutor
多線程步驟的內容來從馬口中聽到它。
Spring Batch提供了ItemWriter和ItemReader的一些實現。 通常他們在Javadocs中說是否是線程安全的,或者你需要做些什么來避免並發環境中的問題。 如果Javadocs中沒有信息,您可以檢查實現以查看是否存在任何狀態
我們現在解決您的問題:
您能否澄清一下:在已分配TaskExecutor的Tasklet中使用開箱即用的FlatFileItemReader是否正確/正確/安全? 無論作家如何。 如果沒有,我們怎么能在理論上解釋使用JPAItemWriter時缺少錯誤?
聲明“ 作家的Regardess ”是不正確的。 您使用的Writer
必須是線程安全的。 JpaItemWriter是針對Java文檔的線程安全的,可以安全地與不是線程安全的FlatFileItemReader
一起使用。 解釋JpaItemWriter
如何是線程安全的將使這個答案很長。 如果您對特定作者如何處理線程安全感興趣,我建議您發布另一個問題。 (正如Spring Batch文檔所述)
PS:我在上面給出的示例鏈接,使用FlatFileItemReader和TaskExecutor,但沒有提到所有可能的線程安全問題。
如果你看一下coherence示例,你會看到它們清楚地修改了圖6中的CoherenceBatchWriter.java
。 他們首先創建mapBatch
局部變量,以便多個線程擁有自己的Map
副本。 此外,如果您深入研究Coherence API,您會發現返回的NamedCache
是線程安全的。
你提供的第二個鏈接看起來非常冒險,因為Writer
沒有做任何事情來避免競爭條件 。 這個例子確實是多線程步驟的錯誤使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.