【问题标题】:In spring batch how can we move the processed files to another folder, I am using MultiResourceItemReader and chunk processing在春季批处理中,我们如何将处理后的文件移动到另一个文件夹,我正在使用 MultiResourceItemReader 和块处理
【发布时间】: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


【解决方案1】:

我看不到在处理每个文件后立即移动它的附加价值,因为无论如何所有文件都会在该步骤之后移动。侦听器方法应该可以工作,但在 windows (https://github.com/spring-projects/spring-batch/issues/1500) 上有一个未解决的问题。因此,我建议在主要步骤之后使用单独的步骤来移动文件。为此,您可以在该步骤中注入相同的资源并在 tasklet 中移动文件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2017-10-06
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多