![](/img/trans.png)
[英]How to Read/write zOS(Mainframe) flat file using spring batch
[英]Using Spring batch to read a file and write to a Map
背景
我對Spring Batch很陌生,並且具有以下要求:
我了解到Spring批處理有一種稱為面向塊的處理,其中一個配置了一個讀取器,處理器和寫入器以處理由commit-interval控制的一定數量的記錄。 可以使用針對讀者的任務執行程序,或通過分區添加多線程的另一層來進一步擴展規模。
題
如上面第2點所述,我想將文件加載到Map中。 為了便於討論,可以說我實現了下面的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 Bean,因此以后可以調用getSomePojoMap來獲取文件中記錄的聚合Map; 但是,在ItemWriter中保存這樣的Map並不是實現此目的的最佳方法。 另一個問題是,使用ConcurrentHashMap可能會降低性能,但是我看不到有其他方法可以以線程安全的方式將文件聚合到Map中。
有沒有比將我的文件保存在編寫器中並使用ConcurrentHashMap更好的方法來將文件聚合到Map中?
差不多。 您可以進行一些小的改進,例如將地圖放在單獨的Bean中,這樣可以使writer Bean和地圖具有不同的生存期,並使地圖的讀取器與writer分離。 例如,您可以將地圖放入作業范圍的Bean中,但仍使編寫者為單例。
如果您的作業被划分為多個線程,則僅需要ConcurrentHashMap
(我假設您不希望跨作業共享地圖)。
為什么不使用File Item Writer。
我認為應該將此映射寫入文件。 可能是平面文件(txt)
如果是這種情況,請嘗試使用FlatFileItemWriter 。 如果您需要將此數據寫入xml文件,則可以使用StaxEventItemWriter 。
即使您不需要將數據寫入文件(批處理結束時僅需要映射)。 我認為將數據寫入文件,然后從文件中讀取整個地圖將是“便宜的”。 將映射保存在作業范圍內意味着該對象將在每個塊中都保留在db中,並且將在每個塊中從db中檢索到,這是非常昂貴的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.