在春季批处理中分隔步骤类

时间:2020-03-28 23:44:15

标签: spring spring-batch itemwriter itemprocessor

我试图找到解决方案,但我无法...ㅠㅠ

我想分开下面的工作步骤。

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

那对我来说是个大问题...
如何等待工作的每个步骤?包括查询。

2 个答案:

答案 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步骤中进行检索。