Я смотрю на обработку чанков с помощью 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 и скопировать файлы в другое место. Мне интересно, как мне передать объект или прочитать вложенный на основе первого.