В весеннем пакете, как мы можем переместить обработанные файлы в другую папку, я использую MultiResourceItemReader и обработку фрагментов

В пакетном приложении 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 ответ

Я не вижу дополнительной ценности перемещения каждого файла, как только он будет обработан, поскольку все файлы все равно будут перемещены после этого шага. Подход слушателя должен работать, но в Windows есть открытая проблема (https://github.com/spring-projects/spring-batch/issues/1500). Следовательно, я рекомендую использовать отдельный шаг для перемещения файлов после основного шага. Для этого вы можете внедрить те же ресурсы на этом шаге и переместить файлы в тасклет.