2017-02-16 160 views
4

有很多示例使用FlatFileItemReader以及TaskExecutor。我提供樣品下方(包括XML和Java的配置):使用FlatFileItemReader和TaskExecutor(線程安全)

我已經與大的CSV寫作與XML配置(GB大小),數據庫用它我的自我開箱即用的JpaItemWriter。即使沒有設置save-state = false或進行任何特殊處理,似乎也沒有問題。

現在,FlatFileItemReader記錄爲爲非線程安全的

我的猜測是JpaItemWriter通過持續集合來「覆蓋」問題,即如果hashCode()equals()覆蓋了實體的業務密鑰,則集合沒有重複。但是,即使如此,僅僅通過非線程安全的讀取和處理來防止重複是不夠的。

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

PS:這個例子鏈接,我上面給,使用FlatFileItemReader用的TaskExecutor沒有在所有可能的線程安全問題提...

+0

我可能是錯的,但你問''FlatFileItemReader'不是'JpaItemWriter'是線程安全的嗎? – CKing

+0

我的問題更一般。我提供了2個鏈接,其中一個FlatFileItemReader與TaskExecutor和不同的Writer一起使用,沒有任何特殊的線程安全處理。此外,我提供了自己的經驗,並試圖給出理論上的解釋,說明JpaItemWriter在某些情況下如何「隱藏」問題。所以換句話說,我的問題是:我們應該如何正確使用它,如果最終能夠按照原樣使用TaskExecutor。 – kmandalas

+0

你的意思是'JpaItemReader'或'JpaItemWriter'? –

回答

3

TL; DR它是安全的使用FlatFileItemReader配備了一TaskExecutorWriter是線程安全的。 (假設您目前不關心重新啓動作業,重試步驟,跳過等)。

更新:現在有JIRA即正式確認saveState需要被設置爲false(即禁止重啓)如果一個人想使用FlatFileItemReader在一個線程安全的方式TaskExecutor


讓我們先通過看什麼Spring documentation說,關於使用多線程的步驟與TaskExecutor從馬口聽到它。

Spring Batch提供ItemWriter和 ItemReader的一些實現。通常他們會在Javadoc中說是否線程安全 ,或者您必須採取哪些措施才能避免併發的 環境中的問題。如果在Javadoc中沒有的信息,您可以檢查 實施情況,看看是否有任何狀態

現在讓我們來解決您的問題:

能否請您澄清:這是正確的/正確的/安全地使用 開箱即用的FlatFileItemReader在Tasklet中已分配 TaskExecutor?無論作家如何。如果不是,那麼在理論上如何解釋 在使用JPAItemWriter時沒有錯誤?

聲明「作者的遺漏」不正確。您使用的Writer必須是線程安全的。 JpaItemWriter對於Java文檔是線程安全的,可以安全地與不是線程安全的FlatFileItemReader一起使用。解釋JpaItemWriter是如何線程安全的將會使這個答案很長。如果您對特定編寫者如何處理線程安全感興趣,我建議您發佈另一個問題。 (如前所述由Spring Batch的文檔以及)

PS:這個例子鏈接,我上面給,使用FlatFileItemReader用的TaskExecutor沒有在所有可能的線程安全問題提..

如果您看一下相關性示例,您會看到它們明確修改CoherenceBatchWriter.java圖6。他們首先製作mapBatch局部變量,以便多個線程擁有自己的Map副本。此外,如果您深入瞭解API,您應該發現返回的NamedCache將是線程安全的。

由於Writer沒有做任何事情來避免競爭條件,您提供的第二個鏈接看起來真的很冒險。這個例子確實是一個多線程步驟的不正確使用。


+0

感謝您提供的所有信息。但是,鑑於面向塊的處理風格,如果'FlatFileItemReader'不是線程安全的,是不是不可能有不同的線程讀取同一行文件?這樣,Writer(即使它是線程安全的)會嘗試最後寫入重複的項目。這就是爲什麼我沒有把重點放在作家部分。 – kmandalas

+0

@kmandalas是的,這是可能的,但如果作者是線程安全的,這個問題是無效的,所以一切都很好。如果你看看* Cohernece *的'Writer'實現,你會發現確保不會有任何重複的寫入,因爲寫入者寫入線程安全的Map和Map並不會執行寫操作。不允許重複的密鑰。此外,'JpaItemWriter'是線程安全的,並且會爲您提供與重複插入IMO相同的隔離。所以即使你沒有強調它,作者也很重要。 – CKing