2014-10-30 34 views
5

在Spring Batch的documentation上,爲了配置一個步驟,清晰的圖片描述瞭如何執行讀取過程和寫入。有關面向塊的步驟與現實的Spring批處理文檔?

read 
process 
... 
read 
process 
// until #amountOfReadsAndProcesses = commit interval 
write 

通訊(根據DOC):

List items = new Arraylist(); 
for(int i = 0; i < commitInterval; i++){ 
    Object item = itemReader.read() 
    Object processedItem = itemProcessor.process(item); 
    items.add(processedItem); 
} 
itemWriter.write(items); 

然而,當我調試,並把一個斷點在讀取器的讀取方法和在我看到的,處理器的處理方法的斷點以下行爲:

read 
... 
read 
// until #amountOfReads = commit interval 
process 
... 
process 
// until #amountOfProcesses = commit interval 
write 

那麼文檔是否錯誤?還是我錯過了一些配置,使其行爲像文檔(沒有發現任何東西)。

我遇到的問題是每個後續讀取都取決於處理器的狀態。讀取器是一個組合,它可以並行讀取兩個源,具體取決於其中一個源中的讀取項目,在一次讀取操作期間只讀取第一個,第二個或兩個源。但是在處理器中讀取哪些源的狀態。目前唯一的解決方案是提交間隔1,這對於性能來說並不是最優的。

+0

你可以試試它與自定義閱讀器,它包裝標準的閱讀器和你的自定義邏輯 – 2014-10-30 15:37:43

+0

是的我想過,但它不符合一批的模型。讀者不負責創建輸出。 – Juru 2014-10-31 06:37:19

+0

我會嘗試與源數據庫表(第一批導入),並閱讀數據與適當的SQL(第二批業務處理) – 2014-10-31 11:13:08

回答

3

簡短的回答是,你是對的,我們的文檔在分塊模型上不準確。這是需要更新的東西。有理由說明爲什麼它是這樣的(它們主要與如何處理容錯有關)。但是這並不能解決你的問題。爲了您的使用情況下,有幾個選項:

  • 配置使用JSR-352配置你的工作 - 對JSR-352是我們的文檔是這麼說的處理模型(他們把它當作福音,而不是什麼Spring Batch的真的嗎)。由於Spring Batch支持JSR-352,只需更改配置以及如何啓動作業,就可以獲得相同的結果。 JSR-352存在侷限性,不在本次討論的範圍內,但它是一種選擇。
  • 另一種選擇是做Michael Pralow建議的事情 - 雖然我理解你對顧慮分離的擔憂,但聽起來你已經違反了規則,因爲你的處理器正在生成讀者需要的輸出(或者你以其他方式分享這個狀態?)。
  • 其他選項 - 如果不瞭解更多關於工作的信息,可能還有其他方法來構建可以很好地工作的工作(如將邏輯移動到多個步驟等),並且仍然實現Spring Batch試圖允許的關注點分離但我需要看到更多的配置才能在那裏提供幫助。
+0

對於選項二。是的,在該步驟的執行上下文中有一個狀態。這不是使用的處理器的輸出。 – Juru 2014-10-31 19:12:33

+0

我如何分享您的工作配置?它並沒有真正與這個問題有關。 – Juru 2014-10-31 19:16:50

+0

創建一個新話題,詢問如何在Spring Batch中處理處理器和閱讀器之間的狀態管理。 – 2014-11-02 20:10:36

相關問題