簡體   English   中英

將FlatFileItemReader與TaskExecutor一起使用(線程安全)

[英]Using FlatFileItemReader with a TaskExecutor (Thread Safety)

有很多例子使用FlatFileItemReaderTaskExecutor 我在下面提供了示例(包括XML和Java Config):

我已經將自己的XML配置用於大型CSV(GB大小),使用開箱即用的JpaItemWriter寫入數據庫。 即使沒有設置save-state = false或采取任何特殊處理,似乎也沒有問題。

現在, FlatFileItemReader被記錄為不是線程安全的

我的猜測是,如果hashCode()equals()覆蓋了實體的業務密鑰, JpaItemWriter通過持久化集合即“覆蓋”該問題,即沒有重復的集合。 但是,即使這樣,由於非線程安全的讀取和處理,也不足以防止重復。

您能否澄清一下:在已分配TaskExecutor的FlatFileItemReader中使用開箱即用的FlatFileItemReader是否正確/正確/安全? 無論作家如何。 如果沒有,我們怎么能在理論上解釋使用JPAItemWriter時缺少錯誤?

PS:我在上面給出的示例鏈接,使用FlatFileItemReader和TaskExecutor,但沒有提到所有可能的線程安全問題......

TL; DR如果Writer是線程安全的,那么使用帶有TaskExecutorFlatFileItemReader是安全的。 (假設您不關心重啟作業,重試步驟,跳過等等)。

更新:現在有一個JIRA正式確認saveState需要設置為false (即禁用可重啟性),如果想要以線程安全的方式使用FlatFileItemReaderTaskExecutor


讓我們首先通過查看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM