将 FlatFileItemReader 和 MultiResourceItemReader 与 SynchronizedItemStreamReader 一起使用
Using FlatFileItemReader and MultiResourceItemReader with SynchronizedItemStreamReader
尝试使用 MultiResourceItemReader 处理多个 csv 文件并使用 FlatFileItemReader 读取每个文件。尝试使用任务执行器处理步骤时,遇到两个问题:
- 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;
- 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 步骤中使用它对我来说没有意义。
如果您想与多个线程并行,我相信分区步骤是更好的选择。在这种情况下,您可以让每个工作线程处理一个不同的文件。
尝试使用 MultiResourceItemReader 处理多个 csv 文件并使用 FlatFileItemReader 读取每个文件。尝试使用任务执行器处理步骤时,遇到两个问题:
- 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;
- 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 步骤中使用它对我来说没有意义。
如果您想与多个线程并行,我相信分区步骤是更好的选择。在这种情况下,您可以让每个工作线程处理一个不同的文件。