【发布时间】:2020-12-04 17:11:25
【问题描述】:
在 Spring 批处理应用程序中,我们如何在处理每个文件时将文件从 BatchFileDir 文件夹移动到目标文件夹。 BatchFileDir 文件夹中会有一堆文件,所以我使用 MultiResourceItemReader。我也在关注基于块的处理。
我有所有的批处理文件:
@Value("BatchFileDir/batchFile_*.csv")
private Resource[] allBatchFiles;
物品阅读器是:
@Bean
public MultiResourceItemReader<MyServiceRequest> multiResourceItemReader() {
MultiResourceItemReader<MyServiceRequest> resourceItemReader = new
MultiResourceItemReader<MyServiceRequest>();
resourceItemReader.setResources(allBatchFiles);
FlatFileItemReader<Record> reader = new FlatFileItemReader<>();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
String[] tokens = {"id", "name", "author", "subject"};
tokenizer.setNames(tokens);
DefaultLineMapper< MyServiceRequest> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(tokenizer);
lineMapper.setFieldSetMapper(new RecordFieldSetMapper());
reader.setLinesToSkip(1);
reader.setLineMapper(lineMapper);
resourceItemReader.setDelegate(reader);
return resourceItemReader;
}
项目处理器是:
@Bean
public ItemProcessor< MyServiceRequest, MyServiceResponse> itemProcessor() {
return new ModifiedItemProcessor();
}
ModifiedItemProcessor 是:
public class ModifiedItemProcessor implements ItemProcessor< MyServiceRequest,
MyServiceResponse > {
public MyServiceResponse process(MyServiceRequest item) {
// interact with other Microservices and get the response
return response;
步骤是:
@Bean
protected Step step(@Qualifier("itemProcessor") ItemProcessor<MyServiceRequest,
MyServiceResponse> processor, ItemWriter<MyServiceRequest> writer) {
return stepBuilderFactory
.get("myStep")
.<MyServiceRequest, MyServiceResponse> chunk(99)
.reader(multiResourceItemReader())
.processor(processor)
.writer(writer)
.build();
}
【问题讨论】:
-
您需要 1) 在处理完每个文件后立即移动它,还是 2) 在步骤完成后移动所有文件?对于 2),您可以使用步骤侦听器或在单独的步骤中执行。您是否尝试过这些选项之一?
-
我的首要任务是移动每个已处理的文件。如果这是不可能的,那么至少在该步骤完成后移动所有文件。为此,我试图使用 getCurrentResource() 获取文件名,然后将其移动到所需的文件夹,但这是给 NullPointerEception,然后不知道我是否可以用 Tasklet 做点什么。请让我知道如何在我的场景中使用步骤列表器
-
For this purpose I was trying to get the filename with getCurrentResource() and then move it to the required folder:不要使用那个方法,它已被弃用删除:github.com/spring-projects/spring-batch/issues/3776。我根据您的评论添加了答案。
标签: java spring-batch spring-batch-tasklet spring-batch-job-monitoring spring-batch-stream