我试图找到解决方案,但我无法...ㅠㅠ
我想分开下面的工作步骤。
step1.class -> step2.class -> step3.class -> done
我如此分裂的原因是我必须在每个步骤中使用查询。
@Bean
public Job bundleJob() {
return jobBuilderFactory.get(JOB_NAME)
.start(step1) // bean
.next(step2) // bean
.next(step3()) // and here is the code ex) reader, processor, writer
.build();
}
我的目的是我必须在步骤1,步骤2中使用返回数据。
但是jpaItemReader就像异步...所以它的处理方式不像上面的命令。
像这样调试流程。
readerStep1 -> writerStep1 -> readerStep2 -> readerWriter2 -> readerStep3 -> writerStep3
and
-> processorStep1 -> processorStep2 -> processorStep3
那对我来说是个大问题...
如何等待工作的每个步骤?包括查询。
答案 0 :(得分:0)
啊哈!知道了
关键是在配置中创建bean。
我编写了注释bean的各种步骤,以便这些步骤在spring之前创建。
解决方案是后期绑定,例如@JobScope
或@StepScope
@Bean
@StepScope. // late creating bean.
public ListItemReader<Dto> itemReader() {
// business logic
return new ListItemReader<>(dto);
}
答案 1 :(得分:0)
要在工作中执行单独的步骤,可以将Flow与TaskletStep一起使用。共享一个片段供您参考,
@Bean
public Job processJob() throws Exception {
Flow fetchData = (Flow) new FlowBuilder<>("fetchData")
.start(fetchDataStep()).build();
Flow transformData = (Flow) new FlowBuilder<>("transformData")
.start(transformData()).build();
Job job = jobBuilderFactory.get("processTenantLifeCycleJob").incrementer(new RunIdIncrementer())
.start(fetchData).next(transformData).next(processData()).end()
.listener(jobCompletionListener()).build();
ReferenceJobFactory referenceJobFactory = new ReferenceJobFactory(job);
registry.register(referenceJobFactory);
return job;
}
@Bean
public TaskletStep fetchDataStep() {
return stepBuilderFactory.get("fetchData")
.tasklet(fetchDataValue()).listener(fetchDataStepListener()).build();
}
@Bean
@StepScope
public FetchDataValue fetchDataValue() {
return new FetchDataValue();
}
@Bean
public TaskletStep transformDataStep() {
return stepBuilderFactory.get("transformData")
.tasklet(transformValue()).listener(sendReportDataCompletionListener()).build();
}
@Bean
@StepScope
public TransformValue transformValue() {
return new TransformValue();
}
@Bean
public Step processData() {
return stepBuilderFactory.get("processData").<String, Data>chunk(chunkSize)
.reader(processDataReader()).processor(dataProcessor()).writer(processDataWriter())
.listener(processDataListener())
.taskExecutor(backupTaskExecutor()).build();
}
在此示例中,我使用了2个流程来获取和转换数据,这些数据将执行来自类的数据。
为了返回步骤1和2中的值,您可以将其存储在作业上下文中,并在具有读取器,处理器和写入器的ProcessData步骤中进行检索。