我是相當新的Spring Batch的,並具有以下要求:
- 讀取一個文件的百萬記錄的minumum (CSV,管道分隔符等)
- 將文件中的每一行加載到一個Map with key作爲第一列,並將值作爲域對象/ POJO加載。
據我所知,Spring批處理有一種稱爲面向塊的處理,其中一個配置讀取器,處理器和一個寫入器來處理由commit-interval支配的一定數量的記錄。這可以進一步使用讀者的任務執行程序或通過分區添加另一層多線程進行擴展。
問題
如在2點以上解釋,我想我的文件加載到地圖。爲了討論的緣故,可以說我實現了下面的ItemWriter,它將塊聚合到一個Map中。
public class MapItemWriter implements ItemWriter<SomePOJO> {
private Map<String, SomePOJO> somePojoMap;
public MapItemWriter() {
System.out.println("Writer created ");
somePojoMap= new ConcurrentHashMap<String, SomePOJO>();
}
public void write(List<? extends SomePOJO> item) throws Exception {
if (item != null && item.size() > 0) {
for (SomePOJO data : item) {
String uniqueId = data.Id();
somePojoMap.put(uniqueId, data);
}
}
}
public Map<String, SomePojo> getSomePojoMap() {
return somePojoMap;
}
}
因爲我有機會到我的ItemWriter豆,我可以再打getSomePojoMap得到彙總圖在我的檔案記錄;然而,在ItemWriter中持有像這樣的Map並不覺得這是最好的方式。另一個問題是,使用ConcurrentHashMap可能會降低性能,但我沒有看到任何其他方式可以以線程安全的方式將文件聚合到Map中。
有沒有更好的方法來將我的文件聚合到一個Map中,而不是在我的writer中保存一個Map並使用ConcurrentHashMap?
爲什麼要將數據加載到地圖中?地圖填充後會發生什麼? –
@MichaelPralow我們有一個遺留系統,它將文件中的數據加載到一個Map中(每個文件一個)。我們想用Spring批次替換數據加載層。這些映射用於匯聚層,該匯聚層將來自不同映射的數據聚合爲在另一個系統偵聽的JMS隊列上發送的主對象。我們不想更改聚合層,因爲這意味着要修改整個遺留系統。我們希望提高數據加載性能。如果我們保持與匯聚層的接口相同,它可以繼續工作,就好像沒有任何變化。 – CKing