Я использую пакет Spring с пружинной загрузкой. Я сталкиваюсь с проблемами при чтении нескольких файлов одновременно, чтобы обработать все данные файла как единый объект. У меня есть производственные требования, пожалуйста, помогите полностью заполнить эти требования.
Sourcefile1.txt:
1001 Tom Moody 29/7/2013
1002 John Parker 30/7/2013
1003 Henry Williams 31/7/2013
Sourcefile2.txt:
1 1001 ACCOUNTING
2 1002 RESEARCH
3 1003 SALES
Окончательный файл выглядит так: Файл назначения.txt
1 1001 Tom Moody ACCOUNTING 29/7/2013
2 1002 John Parker RESEARCH 30/7/2013
3 1003 Henry Williams SALES 31/7/2013
Я хочу обработать эти файлы, используя пакет весенней загрузки. Как добиться окончательного вывода файла. Пожалуйста, помогите Спасибо
java Конфигурация:
@Configuration
@EnableBatchProcessing
public class BatchConfigurationParallel {
Logger logger = LoggerFactory.getLogger(BatchConfigurationParallel.class);
@Autowired
JobBuilderFactory jobBuilderFactory;
@Autowired
StepBuilderFactory stepBuilderFactory;
@Bean
public Job parallelStepsJob() {
Flow masterFlow = new FlowBuilder<Flow>("masterFlow").start(taskletStep("step1")).build();
Flow flowJob1 = new FlowBuilder<Flow>("flow1").start(taskletStep("step2")).build();
Flow flowJob2 = new FlowBuilder<Flow>("flow2").start(taskletStep("step3")).build();
Flow flowJob3 = new FlowBuilder<Flow>("flow3").start(taskletStep("step4")).build();
Flow slaveFlow = new FlowBuilder<Flow>("splitflow").split(new SimpleAsyncTaskExecutor())
.add(flowJob1, flowJob2, flowJob3).build();
return (jobBuilderFactory.get("parallelFlowJob").incrementer(new RunIdIncrementer()).start(masterFlow)
.next(slaveFlow).build()).build();
}
private TaskletStep taskletStep(String step) {
return stepBuilderFactory.get(step).tasklet((contribution, chunkContext) -> {
// IntStream.range(1, 100).forEach(token -> logger.info("Step:" + step + "
// token:" + token));
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Job partitioningJob() throws Exception {
return jobBuilderFactory.get("parallelJob")
.incrementer(new RunIdIncrementer())
.flow(masterStep()).end().build();
}
@Bean
public Step masterStep() throws Exception {
return stepBuilderFactory.get("masterStep").partitioner(slaveStep()).partitioner("partition", partitioner())
.gridSize(1)
.taskExecutor(new SimpleAsyncTaskExecutor()).build();
}
@Bean
public Partitioner partitioner() throws Exception {
MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
partitioner.setResources(resolver.getResources("/hourly/*.txt"));
return partitioner;
}
@Bean
public Step slaveStep() throws Exception {
return stepBuilderFactory.get("slaveStep")
.<CaseWraper, CaseWraper>chunk(1)
.reader(reader(null))
.processor(processor())
.writer(writer()).build();
}
@Bean
public ItemProcessor<CaseWraper, CaseWraper> processor() {
return new CutomItemProcessor();
}
@Bean(name = "reader")
@StepScope
public FlatFileItemReader<CaseWraper> reader(@Value("#{stepExecutionContext['fileName']}") String file)
throws Exception {
FlatFileItemReader<CaseWraper> reader = new FlatFileItemReader<>();
reader.setResource(new UrlResource(file));
System.out.println("file name : " + file);
File filePath = new File(file);
DefaultLineMapper<CaseWraper> lineMapper = new DefaultLineMapper<>();
FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
tokenizer.setStrict(false);
String[] columnNames = { "id", "name", "department", "date" };
tokenizer.setNames(columnNames);
tokenizer.setColumns(new Range(1, 4), new Range(6, 10), new Range(10, 15));
AccountSummaryMapper<Case> accountSummaryMapper = new AccountSummaryMapper<Case>();
accountSummaryMapper.setT(new Case());
lineMapper.setFieldSetMapper(accountSummaryMapper);
lineMapper.setLineTokenizer(tokenizer);
reader.setLineMapper(lineMapper);
return reader;
}
@Bean
public ItemWriter<CaseWraper> writer() {
return (items) -> items.forEach(item -> {
Case _cases = item.get_case();
AccountSummary accountSummary = item.getAccount();
String data = _cases != null ? _cases.getAcctNo()
: "" + " " + accountSummary != null ? accountSummary.getAccountReferenceXid() : "";
logger.info(data);
});
}