2014-09-20 41 views
0

我很苦惱如何設計春季批處理作業。總體目標是檢索約2000萬條記錄並將它們保存到sql數據庫。春季批處理作業設計 - 多讀者

我是這樣做的兩部分。首先,我檢索我想要檢索的記錄的2000萬個ID並將其保存到文件(或DB)中。這是一個相對較快的操作。其次,我循環訪問我的Ids文件,分批處理2,000個,並從外部服務中檢索相關記錄。然後我再重複一遍,每次記錄2000個Ids,直到我找回所有記錄。對於我檢索的每批2,000條記錄,我將它們保存到數據庫中。

有些人可能會問爲什麼我這樣做是分兩步進行的。我最終計劃使第二步平行運行,以便可以並行檢索2,000個記錄的批次,並希望大大加快下載速度。有了Ids,我可以將這項工作分成多個批次。現在,我們不必擔心並行性,只關注如何設計更簡單的順序工作。

想象一下,我已經解決了本地保存所有Ids的第一個問題。他們在一個文件中,每行一個Id。我如何設計第二部分的步驟?

下面是我在想什麼......

使用平面文件閱讀器讀取的ID 2000。我需要一個聚合器,因爲我只想對每個2K Ids批次的外部服務執行一個查詢。這是我掙扎的地方。我是否嵌套一系列讀者?或者我可以在處理器或作家中「讀」嗎?

本質上,我的問題是我想從文件讀取行,聚合這些行,然後立即做另一個「讀取」來檢索相應的記錄。我幾乎想要將讀者聯繫在一起。

最後,一旦我從外部服務中檢索到記錄,我將擁有一個記錄列表。這意味着當他們到達作家時,我會列出一個列表。我想要一個對象列表,以便我可以使用JdbcItemWriter開箱即用。

想法?希望這是有道理的。

安德魯

+0

我剛剛在文檔中找到了這個例子,似乎表明我應該在處理器中檢索完整對象(使用來自閱讀器的ID)。也許我會從字面上理解這些接口名稱。處理器中的「讀取」感覺很奇怪。 HTTP://docs.spring。IO /彈簧分批/中繼/參考/ HTML/patterns.html#drivingQueryBasedItemReaders – anschoewe 2014-09-20 20:49:44

回答

0

這是設計的問題,是主觀的,但是基於Spring Batch的例子,我發現(來自SpringSource的)和我個人的經驗,在處理器的步驟做addtional閱讀的模式是一個很好的解決這個問題。您也可以在「處理器」步驟中將多個處理器/讀取器鏈接在一起。所以,雖然名稱並不完全匹配,但我發現自己在處理器中做了越來越多的「閱讀」。

[http://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#drivingQueryBasedItemReaders][1] 
0

既然你想每塊只有一次調用2.000記錄您的外部服務,你會真正想做的事在這個ItemWriter服務調用。這是進行塊級處理的標準推薦方式。

您可以創建自定義ItemWriter<Long>實現。它將收到2.000個ID列表作爲輸入,並呼叫外部服務。外部服務的結果應該允許你創建一個List<Item>。然後,您的作者可以簡單地將此List<Item>轉發給您的JdbcItemWriter<Item>代表。

相關問題