Настройка параллельных шагов пакета Spring (Split) с использованием аннотаций


Где бы я ни заглядывал в документацию Spring Batch для параллельного выполнения шагов, я вижу только его конфигурацию через XML, как показано ниже.

<split id="split1" next="step4">
<flow>
    <step id="step1" parent="s1" next="step2"/>
    <step id="step2" parent="s2"/>
</flow>
<flow>
    <step id="step3" parent="s3"/>
</flow>

Я пишу приложение, используя Spring Batch, где я также использовал Spring Boot, и все мои конфигурации сделаны с использованием аннотаций. Есть ли я могу настроить шаг разделения с помощью конфигурации Java? Я проверил документацию API интерфейса Step в пакете Spring, но у него нет значения по умолчанию реализация для шага разделения. Есть ли способ реализовать его с помощью существующих реализаций по умолчанию?

В настоящее время я реализовал свои другие задания следующим образом:

@Bean
public Step someStep() {
    return stepBuilderFactory.get("someStep")
            .<A, B> chunk(1-).reader(someReader)
            .processor(someProcessor).writer(someWriter).build();
}

@Bean
public Job historicalDataJob() {
    return jobBuilderFactory.get("someJOb")
            .incrementer(new RunIdIncrementer()).flow(someStep()).end()
            .build();
}
1 2

1 ответ:

SimpleJobBuilder предоставляет средства для настройки разделения через java config. Ниже приведен пример, взятый из FlowJobBuilderTests (https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/test/java/org/springframework/batch/core/job/builder/FlowJobBuilderTests.java)Очевидно, вы захотите немного разбить это, но это должно проиллюстрировать общую идею.

// Create each flow
Flow flow = new FlowBuilder<Flow>("subflow").from(step1).end();

// Create the job
SimpleJobBuilder builder = new JobBuilder("flow").repository(jobRepository).start(step2);

// Create split providing an async task executor so the flows are executed in parallel
builder.split(new SimpleAsyncTaskExecutor()).add(flow).end();

// Build the job and execute it
builder.preventRestart().build().execute(execution);