簡體   English   中英

Spring 批處理步驟未讀取完整文件

[英]Spring batch Step does not read full file

嗨,我對 Spring 批處理有問題,我通過兩步創建一個作業,第一步讀取 csv 文件,通過塊過濾錯誤值並保存到數據庫中,然后第二次調用存儲過程。

我的問題是,由於某種原因,第一步僅讀取部分數據文件 2,5GB csv。

該文件有大約 13M 的記錄,但只保存了大約 400K。

任何人都知道為什么會發生這種情況以及如何解決它?

Java版本: 8

Spring開機版2.7.1

這是我的一步

    @Autowired
    @Bean(name = "load_data_in_db_step")
    public Step importData(
            MyProcessor processor,
            MyReader reader,
            TaskExecutor executor,
            @Qualifier("step-transaction-manager") PlatformTransactionManager transactionManager
    ) {
        return stepFactory.get("experian_portals_imports")
                .<ExperianPortal, ExperianPortal>chunk(chunkSize)
                .reader(reader)
                .processor(processor)
                .writer(new JpaItemWriterBuilder<ExperianPortal>()
                        .entityManagerFactory(factory)
                        .usePersist(true)
                        .build()
                )
                .transactionManager(transactionManager)
                .allowStartIfComplete(true)
                .taskExecutor(executor)
                .build();
    }

這是 MyReader 的定義

@Slf4j
@Component
public class MyReader extends FlatFileItemReader<ExperianPortal>{
    private final MyLineMapper mapper;
    private final Resource fileToRead;

    @Autowired
    public ExperianPortalReader(
            MyLineMapper mapper,
            @Value("${ext.datafile}") String pathToDataFile
    ) {
        this.mapper = mapper;
        val formatter = DateTimeFormatter.ofPattern("yyyyMM");
        fileToRead = new FileSystemResource(String.format(pathToDataFile, formatter.format(LocalDate.now())));
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setLineMapper(mapper);
        setEncoding(StandardCharsets.ISO_8859_1.name());
        setLinesToSkip(1);
        setResource(fileToRead);
        super.afterPropertiesSet();
    }


}

編輯:我已經嘗試使用單線程策略,我認為這可能是 RepeatTemplate 的問題,但我不知道如何正確使用它。

編輯 2 :我放棄了自定義解決方案,並使用了默認組件,它們工作正常,問題得到解決。

記住只使用 spring 批量組件

這是因為您在多線程步驟中使用了非線程安全的項目閱讀器。 您的項目閱讀器擴展了FlatFileItemReader ,而FlatFileItemReader不是線程安全的: 將 FlatFileItemReader 與 TaskExecutor (Thread Safety) 一起使用 您可以嘗試使用單個線程步驟(刪除.taskExecutor(executor) ),您會看到將讀取整個文件。

發生的情況是線程正在同時讀取記錄並且讀取計數不被遵守(線程正在增加讀取計數並且步驟“認為”文件已被完全讀取)。 你有幾個選擇:

  • 同步在您的項目閱讀器中read的調用
  • 將您的閱讀器包裝在SynchronizedItemStreamReader中(結果與前一點相同)
  • 使您的項目閱讀器 bean 步進范圍

暫無
暫無

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

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