2015-09-14 67 views
0

如何配置Spring批處理(使用Java配置)在單個事務中寫入所有塊?Spring批處理Java配置提交間隔

我有一個簡單的簡單的Spring批處理作業,只需一步。該步驟由JdbcCursorItemReader,一個自定義項目處理器和一個自定義項目編寫器組成。目前,我在StepBuilder上設置了塊大小。這似乎也將提交間隔設置爲相同的值。一方面,我不想將所有項目加載到內存中,因此需要面向塊的處理。另一方面,處理器需要對所有項目進行單個事務,而不僅僅是當前塊中的項目。它不會將項目存儲在內存中。沒關係,如果#write被多次調用。

如何使用Java配置來實現?

回答

1

IMO,這種方法打破了春季批次的設計方式。

Spring批處理背後的全部想法是,你承諾每個塊,並且Spring-batch跟蹤哪些記錄已經被處理,以便提供重啓,跳過和失敗處理策略。

如果你真的需要在整個過程中進行交易,爲什麼要使用spring-batch呢?我的意思是,你可以直接使用讀者和作者,並在你自己的簡單循環中使用它們。像這樣的東西。

transaction.open(); 
while (not all processed) { 
    List currentChunk = new List..; 
    for(int i<0;i<chunkSize;i++) { 
     Object readItem = jdbcCursorItemReader.read(); 
     if (readItem == null) { 
     break; 
     } 
     Object processedItem = processor.process(readItem); 
     if (processedItem != null) { 
      currentChunk.add(processedItem); 
     } 
    } 

    yourWriter.write(currentChunk); 
} 
transaction.commit(); 
+0

我不知道這是否可以用一個步驟執行偵聽器來完成。 –

+0

我想可能是。我們將嘗試在beforeStep方法中打開事務,並在afterStep方法中提交它。我不確定的是:我們能以某種方式配置作者使用我們自己的事務嗎?但是,仍然存在這個問題,我們繞過了SB的核心概念。而且,它也只適用於小的工作量,因爲我們通常不想長時間運行事務。 –

0

在一次寫所有塊是相反的SB設計和哲學。
如果你想要你可以閱讀所有的項目,把它們放在一個大塊並寫入;你將獲得相同的結果。
檢查Spring Batch Chunk processing尋求可能的解決方案。

+0

不,它不會是相同的結果。所有項目都將存儲在內存中,這僅適用於小型工作負載。 –

+0

是的,你是對的。但我不知道如何破解SB交易管理 –

相關問題