spring批量读取多个文件写入一个文件
spring batch read from multiple files and write to one file
我有 spring 从多个文件读取并写入多个文件的批处理配置。是否可以只写入一个文件并从多个文件中读取。假设我收到巨大的 XML 文件,我将 XML 分成小文件并使用分区程序并并行读取小文件。但是我需要将从不同的小 xml 文件读取的所有数据写入一个输出文件。 spring 批处理有可能吗?我知道可以通过使编写器同步来实现,但我正在寻找任何其他可能的方法
作业配置
@Bean
public Job job(final Step parser) {
return jobBuilderFactory.get("JOB")
.flow(parser)
.end()
.build();
}
@Bean
public Step parser(final Step parserWorker, final Partitioner partitioner) {
return stepBuilderFactory.get("parser")
.partitioner("parser", partitioner)
.step(parserWorker)
.taskExecutor(taskExecutor())
.build();
}
@Bean
public Step parserWorker(
final StaxEventItemReader reader,
final FlatFileItemWriter<Employee> writer) {
return stepBuilderFactory.get("parserWorker")
.<Employee, Employee>chunk(Integer.parseInt(chunkSize))
.reader(reader)
.writer(writer)
.build();
}
@Bean
@StepScope
public StaxEventItemReader<Employee> reader(final @Value("file:#{stepExecutionContext[file]}") Resource resource) {
StaxEventItemReader<Employee> staxEventItemReader = new StaxEventItemReader<>();
staxEventItemReader.setResource(resource);
staxEventItemReader.setFragmentRootElementName("Employee");
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setClassesToBeBound(Employee.class);
staxEventItemReader.setUnmarshaller(unMarshaller);
return staxEventItemReader;
}
@Bean()
public FlatFileItemWriter<Employee> fileWriter() {
FlatFileItemWriter<Employee> fileWriter = new FlatFileItemWriter<>();
fileWriter.setResource(new FileSystemResource("out.csv"));
EmployeeAggregator lineAggregator = new EmployeeAggregator();
fileWriter.setLineAggregator(lineAggregator);
fileWriter.setLineSeparator(EMPTY_STRING);
fileWriter.setHeaderCallback(new HeaderCallback());
fileWriter.setFooterCallback(new FooterCallback());
return innlesFileWriter;
}
我收到错误 org.springframework.batch.item.ItemStreamException: Output file was not created:
I have spring batch configuration which reads from multiple files and write mutiple file.
您可以创建一个额外的步骤来合并输出文件。由于输出文件是一个平面文件,这可以毫无问题地完成(如果输出文件是一个 XML 文件,那会有点问题,因为你需要处理 XML 声明,headers, 合并文件时等).
另一种技术是使用暂存区(table、queue 等)并添加一个从暂存区读取并写入最终文件的步骤。
我有 spring 从多个文件读取并写入多个文件的批处理配置。是否可以只写入一个文件并从多个文件中读取。假设我收到巨大的 XML 文件,我将 XML 分成小文件并使用分区程序并并行读取小文件。但是我需要将从不同的小 xml 文件读取的所有数据写入一个输出文件。 spring 批处理有可能吗?我知道可以通过使编写器同步来实现,但我正在寻找任何其他可能的方法 作业配置
@Bean
public Job job(final Step parser) {
return jobBuilderFactory.get("JOB")
.flow(parser)
.end()
.build();
}
@Bean
public Step parser(final Step parserWorker, final Partitioner partitioner) {
return stepBuilderFactory.get("parser")
.partitioner("parser", partitioner)
.step(parserWorker)
.taskExecutor(taskExecutor())
.build();
}
@Bean
public Step parserWorker(
final StaxEventItemReader reader,
final FlatFileItemWriter<Employee> writer) {
return stepBuilderFactory.get("parserWorker")
.<Employee, Employee>chunk(Integer.parseInt(chunkSize))
.reader(reader)
.writer(writer)
.build();
}
@Bean
@StepScope
public StaxEventItemReader<Employee> reader(final @Value("file:#{stepExecutionContext[file]}") Resource resource) {
StaxEventItemReader<Employee> staxEventItemReader = new StaxEventItemReader<>();
staxEventItemReader.setResource(resource);
staxEventItemReader.setFragmentRootElementName("Employee");
Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
unMarshaller.setClassesToBeBound(Employee.class);
staxEventItemReader.setUnmarshaller(unMarshaller);
return staxEventItemReader;
}
@Bean()
public FlatFileItemWriter<Employee> fileWriter() {
FlatFileItemWriter<Employee> fileWriter = new FlatFileItemWriter<>();
fileWriter.setResource(new FileSystemResource("out.csv"));
EmployeeAggregator lineAggregator = new EmployeeAggregator();
fileWriter.setLineAggregator(lineAggregator);
fileWriter.setLineSeparator(EMPTY_STRING);
fileWriter.setHeaderCallback(new HeaderCallback());
fileWriter.setFooterCallback(new FooterCallback());
return innlesFileWriter;
}
我收到错误 org.springframework.batch.item.ItemStreamException: Output file was not created:
I have spring batch configuration which reads from multiple files and write mutiple file.
您可以创建一个额外的步骤来合并输出文件。由于输出文件是一个平面文件,这可以毫无问题地完成(如果输出文件是一个 XML 文件,那会有点问题,因为你需要处理 XML 声明,headers, 合并文件时等).
另一种技术是使用暂存区(table、queue 等)并添加一个从暂存区读取并写入最终文件的步骤。