簡體   English   中英

Spring Batch FlatFileItemReader 繼續使用錯誤數量的令牌

[英]Spring Batch FlatFileItemReader continue on incorrect number of tokens

我正在使用 Spring Batch FlatFileItemReader來解析 csv 文件。 我時不時地得到一條格式錯誤的行,應用程序完全崩潰:

Caused by: org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 11 actual 18

有沒有辦法告訴FlatFileItemReader繼續(拋出異常並繼續或忽略並繼續)而不完全退出應用程序。

我猜我可能需要擴展 FlatFileItemReader 來實現這一點,因為似乎沒有任何設置。 關於如何最好地進行並實現這一目標的任何建議?

您可以為批處理作業配置 SkipLogic 這是文檔鏈接

基本上,如果您使用 Java Config 來管理您的批處理作業,您可以執行以下操作

stepBuilderFactory.get("step1")
                .<Person, Person>chunk(10)
                .reader(reader)
                .writer(writer)
                .processor(processor)
                .faultTolerant()
                .skipLimit(10)
                .skip(RuntimeException.class)
                .listener(skipListener) // if you want to add
                .build();

我能夠通過創建一個擴展DefaultLineMapper的類來解決這個問題,該類被注入到FlatFileItemReader

然后我像這樣覆蓋了 mapLine 方法:

@Override
public T mapLine(String line, int lineNumber) throws Exception {
    T t = null;

    try {
        t = super.mapLine(line, lineNumber);
    } catch (Exception e) {
        log.error("Unable to parse line number <<{}>> with line <<{}>>.", lineNumber, line);
    }

    return t;
}

我不確定這是否與您的問題相同,但是在解析包含引號字符的插入符號“^”分隔文件時,我遇到了同樣的錯誤。

"字符旨在用於跨行結尾擴展字段或包含包含分隔符的字符串。所以我的行看起來像這樣:

^3500 LCF Gas:  109" Wheelbase, Reg Cab^Chevrolet^3500 LCF Gas^109" Wheelbase, Reg Cab^L

將被解析為只有 2 個字段:

  1. 3500 LCF Gas:109" 軸距,Reg Cab^Chevrolet^3500 LCF Gas^109" 軸距,Reg Cab

我真正想要的是 5 個字段:

  1. 3500 LCF 汽油:109" 軸距,Reg 駕駛室
  2. 雪佛蘭
  3. 3500 LCF 氣體
  4. 109" 軸距,Reg 駕駛室

我的文件不包含任何 & 符號,所以我將DelimitedLinetokenizer默認quoteCharacter 從"更改為&

lineTokenizer.setQuoteCharacter('&');

這解決了我在使用 Spring Batch 時導致相同錯誤的問題。

我設法通過將DefaultLineMapper的屬性“ lineTokenizer ”的屬性“ strict ”設置為false來解決這個問題。

暫無
暫無

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

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