簡體   English   中英

使用Spring批處理讀取文件並寫入Map

[英]Using Spring batch to read a file and write to a Map

背景

我對Spring Batch很陌生,並且具有以下要求:

  1. 讀取至少具有一百萬條記錄的文件(CSV,分隔管道等)
  2. 將文件中的每一行加載到Map中,鍵為第一列,值為域對象/ POJO。

我了解到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM