0

我试图找到解决方案,但我不能...... ㅠㅠ

我想在下面的工作中分离步骤。

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();
    }

我的目的是我必须使用step1,step2中的返回数据。但是 jpaItemReader 就像 async ...所以它不会像上面的顺序那样处理。
像这样的调试流程。

readerStep1 -> writerStep1 -> readerStep2 -> readerWriter2 -> readerStep3 -> writerStep3 
and
-> processorStep1 -> processorStep2 -> processorStep3

这对我来说是个大问题......我
如何才能等待工作中的每一步?包括查询。

4

2 回答 2

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 步骤中检索该值。

于 2020-03-30T11:11:06.963 回答
0

啊哈!我知道了。
关键是在配置中创建 bean。
我编写了注释bean的各种步骤,以便由spring创建。

解决方案是后期绑定,例如@JobScope@StepScope

    @Bean
    @StepScope. // late creating bean.
    public ListItemReader<Dto> itemReader() {
        // business logic
        return new ListItemReader<>(dto);
    }
于 2020-03-29T00:43:44.057 回答