Я злонамеренно сделал код, чтобы проверить, как работает пакетный поток.
@Bean
public Step conditionalJobStep1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is stepNextConditionalJob Step1");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step conditionalJobStep2() {
return stepBuilderFactory.get("conditionalJobStep2")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is stepNextConditionalJob Step2");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step conditionalJobStep3() {
return stepBuilderFactory.get("conditionalJobStep3")
.tasklet((contribution, chunkContext) -> {
log.info(">>>>> This is stepNextConditionalJob Step3");
return RepeatStatus.FINISHED;
}).build();
}
Вот шаги и тасклеты.
@Bean
public Job stepNextConditionalJob() {
return jobBuilderFactory.get("stepNextConditionalJob")
.start(conditionalJobStep1())
.on("FAILED")
.to(conditionalJobStep3())
.on("*")
.end()
.from(conditionalJobStep1())
.on("*")
.to(conditionalJobStep3())
.next(conditionalJobStep2())
.on("*")
.to(conditionalJobStep1())
.on("*")
.end()
.end()
.build();
}
приведенные выше результаты кода 1-›3-›2-›1-›3-›2-›1-›..... инф. Я думал, что делает этот поток.
Мое мнение: шаг 1 не НЕУДАЧЕН, поэтому начните (1) -> до (1) и из (1) -> (3) -> (2) -> до (1) и из (1) -> (3) -› (2) -› ...
но когда я изменил всего 2 числа, как это задание (код, который изменил только Step2 и Step3 по сравнению с предыдущим кодом после from (step1)) приводит только к 1-> 2-> 3-> Конец задания.
@Bean
public Job stepNextConditionalJob() {
return jobBuilderFactory.get("stepNextConditionalJob")
.start(conditionalJobStep1())
.on("FAILED")
.to(conditionalJobStep3())
.on("*")
.end()
.from(conditionalJobStep1())
.on("*")
.to(conditionalJobStep2())
.next(conditionalJobStep3())
.on("*")
.to(conditionalJobStep1())
.on("*")
.end()
.end()
.build();
}
Многие из собственных экспериментов относятся к сразу после старта.
Я не знаю, почему это так работает.
Что делает эту разницу?
jobBuilderFactory.get("stepNextConditionalJob").from(stepA)...
, а не сjobBuilderFactory.get("stepNextConditionalJob").start(stepA)..
. Оба синтаксиса эквивалентны, если поток определен правильно. Я рекомендую тот, что в ответе, потому что он более явный и менее подвержен забыванию переходов. 24.02.2021