Отдельные ступени урока в весенней партии - PullRequest
0 голосов
/ 29 марта 2020

Я пытался найти решение, но не могу ... ㅠㅠ

Я хочу разделить шаги в работе, как показано ниже.

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 похож на asyn c ... поэтому он не обрабатывается, как указано выше.
поток отладки, подобный этому.

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

, что для меня большая проблема ...
Как я могу ждать каждый шаг в работе? Включая запросы.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

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

0 голосов
/ 29 марта 2020

ах! Я понял.
Дело в том, что создание bean-компонентов в конфигурации.
Я написал bean-компонент аннотации всех видов шагов, чтобы они создавались Spring.

раствор с поздним связыванием типа @JobScope или @StepScope

    @Bean
    @StepScope. // late creating bean.
    public ListItemReader<Dto> itemReader() {
        // business logic
        return new ListItemReader<>(dto);
    }
...