将 FlatFileItemReader 和 MultiResourceItemReader 与 SynchronizedItemStreamReader 一起使用

Using FlatFileItemReader and MultiResourceItemReader with SynchronizedItemStreamReader

尝试使用 MultiResourceItemReader 处理多个 csv 文件并使用 FlatFileItemReader 读取每个文件。尝试使用任务执行器处理步骤时,遇到两个问题:

  1. ReaderNotOpenException。出现此问题是因为在多线程环境中处理多个文件,并且可能存在一个线程尝试从其他线程关闭的 csv 文件中读取的情况。为了解决这个问题,我正在考虑使用 SynchronizedItemStreamReader 如下:
MultiResourceItemReader<activeForecast> resourceItemReader = new MultiResourceItemReader<>();
        resourceItemReader.setResources(DataSyncUtils.getFileName(activeForecastFilePath));
        resourceItemReader.setDelegate(activeForecastReader());
        SynchronizedItemStreamReader<activeForecast> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>();
        synchronizedItemStreamReader.setDelegate(resourceItemReader);
        return synchronizedItemStreamReader;
  1. FlatFileItemReader 在与任务执行器一起使用时给出不一致的结果。因此,为了克服这个问题,我计划按照此处的建议使用 SynchronizedItemStreamReader:

我的问题:我是否需要将 SynchronizedItemStreamReader 与 FlatFileItemReader 和 MultiResourceItemReader 一起使用?如果是,为什么以及如何?

    @Bean("activeForecastitemReader")
    @StepScope
    public MultiResourceItemReader<activeForecast> activeForecastItemReader() {
        MultiResourceItemReader<activeForecast> resourceItemReader = new MultiResourceItemReader<>();
        resourceItemReader.setResources(DataSyncUtils.getFileName(activeForecastFilePath));
        resourceItemReader.setDelegate(activeForecastReader());
        return resourceItemReader;
    }

    public FlatFileItemReader<activeForecast> activeForecastReader() {
        FlatFileItemReader<activeForecast> flatFileItemReader = new FlatFileItemReader<>();
        flatFileItemReader.setName("activeForecast-Reader");
        flatFileItemReader.setLineMapper(activeForecastLineMapper());
        flatFileItemReader.setLinesToSkip(1);
        flatFileItemReader.setSaveState(false);
        return flatFileItemReader;
    }

MultiResourceItemReader顺序读取文件。所以在 multi-threaded 步骤中使用它对我来说没有意义。

如果您想与多个线程并行,我相信分区步骤是更好的选择。在这种情况下,您可以让每个工作线程处理一个不同的文件。