简体   繁体   English

在 spring 批处理中,我们如何将处理后的文件移动到另一个文件夹,我正在使用 MultiResourceItemReader 和块处理

[英]In spring batch how can we move the processed files to another folder, I am using MultiResourceItemReader and chunk processing

In Spring batch application how can we move files from BatchFileDir folder to a destination folder as each file gets processed.在 Spring 批处理应用程序中,我们如何在处理每个文件时将文件从 BatchFileDir 文件夹移动到目标文件夹。 There would be a bunch of files in BatchFileDir folder so I am using MultiResourceItemReader. BatchFileDir 文件夹中会有一堆文件,所以我使用 MultiResourceItemReader。 I am also following the chunk based processing.我也在关注基于块的处理。

I have all batch files as:我有所有的批处理文件:

    @Value("BatchFileDir/batchFile_*.csv")
    private Resource[] allBatchFiles;

The Item reader is:项目阅读器是:

    @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;
}

and the Item processor is:项目处理器是:

    @Bean
    public ItemProcessor< MyServiceRequest, MyServiceResponse> itemProcessor() {
    return new ModifiedItemProcessor();
    }
   

the ModifiedItemProcessor is: ModifiedItemProcessor 是:

    public class ModifiedItemProcessor implements ItemProcessor< MyServiceRequest, 
    MyServiceResponse > {
    
    public MyServiceResponse process(MyServiceRequest item) {
    // interact with other Microservices and get the response
    return response;

the step is:步骤是:

       @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();
}

I don't see the added value of moving each file as soon as it gets processed, since all files will be moved after the step anyway.我看不到在处理完每个文件后立即移动它的附加价值,因为无论如何,所有文件都将在该步骤之后移动。 The listener approach should work, but there is an open issue on windows ( https://github.com/spring-projects/spring-batch/issues/1500 ).侦听器方法应该有效,但 windows ( https://github.com/spring-projects/spring-batch/issues/1500 )存在一个未解决的问题。 Hence, I recommend using a separate step to move files after the main step.因此,我建议在主要步骤之后使用单独的步骤来移动文件。 For that, you can inject the same resources in that step and move files in a tasklet.为此,您可以在该步骤中注入相同的资源并在 tasklet 中移动文件。

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

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