繁体   English   中英

将 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: Can I use FlatfileItemReader with Taskexecutor?

我的问题:我是否需要将 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按顺序读取文件。 所以在多线程步骤中使用它对我来说没有意义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM