簡體   English   中英

Spring 批處理 - 如何將多個項目的列表從輸入傳遞到 ItemReader、ItemProcessor 和 ItemWriter

[英]Spring Batch- how to pass list of multiple items from input to ItemReader, ItemProcessor and ItemWriter

我有一個簡單的 csv 文件,我正在讀取 1000 個塊,插入到數據庫中。 現在,如果我想檢查該行是否存在於 db 中並且在插入之前是否等於輸入,如果存在並且行是否相等-忽略,否則插入或更新,我正在使用 ItemProcessor。 實施此操作后,意識到 jdbc 調用太慢(平均 120 毫秒),並希望在調用 db 之前對 id 進行批處理並檢查輸入。 在這個階段,ItemReader 一次將一個項目傳遞給 ItemProcessor。 現在我試圖一次將 1000 個項目傳遞給 ItemProcessor,以便可以批處理 jdbc 調用。 在嘗試此操作時,能夠檢查一些示例但無法讓讀者工作。 這是示例代碼。

public class customReader implements ItemReader<List<T>> {
private static List<T> records = null;
ItemReader<String> itemReader;

@Autowired customDao customDao; 
private int index = 0; 
@Override public List<T> read() throws Exception {
//reader logic
//while(records.size() < 1000){
      String record = itemReader.read();
      if(Objects.isNull(record)){
          break;
      } 
      records.add(record);
 }
 return (List<T>) records;

}

這是配置

@Bean
    return stepBuilderFactory
            .get("step")
            .<List<String>, List<String>>chunk(1000)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();

如果有人有一個簡單的示例,他們可以將 csv 文件的 1000 行列表傳遞給處理器,請分享示例。 檢查了共享的示例: 使項目閱讀器返回列表而不是單個 object - Spring 批處理獲取異常,未經檢查的對處理器的調用,寫入器等。

Spring Batch - Item Reader 和 ItemProcessor 以及上面檢查過的列表,但有例外,如評論中列出的和未檢查的類型等。如果您有閱讀器、處理器和編寫器的工作示例,在一個事務中沒有多行,請分享穿線。

從這個問題看來,您在使用自定義 ItemReader 閱讀列表時遇到問題(如果有任何其他問題,請糾正我)。首先,您可以發布 ItemProcessor 和 ItemWriter 的結構,這將有助於獲得更多信息問題的洞察力。

只是為了更清楚地了解 spring 批處理是如何工作的,您使用閱讀器一次讀取一個或多個項目。但是,批處理框架一次將一個項目發送到處理器(即使它已經通過批量讀取准備了一個項目列表) 並且寫入器將從處理器接收 output 列表以寫入目標(基於塊大小)。如果您正在從讀取器讀取列表並從讀取器返回相同的列表,則處理器將接收該列表以進行處理,但寫入器應該具有 List<List>來寫。 在某種程度上,批處理會將您已讀取並傳遞給處理器的 List 視為 1 個單個項目並根據塊大小,如果它是 10(比如說),它將在其他列表中添加 10 個 List 並發送該 List<List>給作家。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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