Поделитесь данными и скопируйте файлы - PullRequest
0 голосов
/ 26 октября 2019

Я смотрю на обработку чанков с помощью Spring Batch, мне нужно прочитать файл с подпапкой, еще раз с информацией о подпапках, я читаю эту папку и обрабатываю файлы, я могу получить первый объект файла,Как я получаю этот первый объект и передаю эти данные вложенному считывателю, а затем выполняю необходимую обработку, например, копирование файла в другую папку

Нужно ли мне использовать stepexecutionlistener или есть лучший способ получить данныетаким образом, чтобы его можно было использовать на шаге или на следующих шагах.

Структура папок будет, например, для

Folder 1
--------
batch.txt
==========
/subfolder 1 1

Folder1/subfolder
=================
allfiles.csv
file1
file2...
@Configuration
@EnableBatchProcessing
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class FilepollerbatchApplication {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Autowired
    ResourcePatternResolver resoursePatternResolver;

    public static void main(String[] args) {
        SpringApplication.run(FilepollerbatchApplication.class, args);
    }

    @Bean
    public Job processJob() throws Exception {
        return jobs.get("processJob").start(masterStep()).build();
    }

    @Bean
    public Step masterStep() throws Exception {
        return steps.get("masterStep").partitioner("slaveStep", partitioner()).step(slaveStep()).taskExecutor(taskExecutor()).build();
    }

    @Bean
    public Step slaveStep() throws Exception {
        return steps.get("slaveStep").<BatchFile, BatchFile>chunk(5).<BatchFile, BatchFile>reader(readMainBatchFile(null)).writer(t -> System.out.println(t)).build();
    }

    @Bean
    @StepScope
    public BatchItemReader readMainBatchFile(@Value("#{stepExecutionContext[fileName]}") String filename) throws Exception {
        BatchItemReader itemReader = new BatchItemReader();
        itemReader.setResource(new UrlResource("file:src/main/resources/batch/" + filename));
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(" ");
        String[] tokens = {"actualBatchLocation", "fileCount", "documentCount"};
        tokenizer.setNames(tokens);
        DefaultLineMapper<BatchFile> lineMapper = new DefaultLineMapper<>();
        lineMapper.setLineTokenizer(tokenizer);
        lineMapper.setFieldSetMapper(new FieldSetMapper<BatchFile>() {
            @Override
            public BatchFile mapFieldSet(FieldSet fieldSet) throws BindException {
                return new BatchFile(fieldSet.readString(0), fieldSet.readInt(1), fieldSet.readInt(2));
            }
        });
        itemReader.setLineMapper(lineMapper);
        return itemReader;
    }

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setMaxPoolSize(2);
        taskExecutor.setCorePoolSize(2);
        return taskExecutor;
    }

    @Bean
    public CustomMultiResourcePartitioner partitioner() {
        CustomMultiResourcePartitioner partitioner = new CustomMultiResourcePartitioner();
        Resource[] resources;
        try {
            resources = resoursePatternResolver.getResources("file:src/main/resources/batch/*.txt");
            partitioner.setResources(resources);
            partitioner.setKeyName("fileName");
            partitioner.partition(2);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("I/O problems when resolving the input file pattern.", e);
        }
        return partitioner;
    }
}

В бине slaveStep, когда главныйСчитыватель пакетных файлов готов, мне нужно вложить считыватели в зависимости от местоположения пакетного файла, прочитать csv и скопировать файлы в другое место. Мне интересно, как мне передать объект или прочитать вложенный на основе первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...