我恶意地编写了一个代码来检查批处理流是如何工作的。
@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)->(3)->(2)->到(1)&从(1)->(3)->(2)->。。。
但是,当我只修改了两个像这个作业一样的数字(在from(step1)之后只修改了step2和step3的代码)时,结果只是1->2->3->job end。
@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();
}
许多自己的实验都是在“开始”之后与“到”相关的。
我不知道为什么会这样。
这有什么区别?
1条答案
按热度按时间bgtovc5b1#
您的流程没有定义上步骤2的结果
*
. 您有:和
但第二步没有这样的结构。您为步骤2定义的唯一结果是:
也就是说,不管第2步的退出代码是什么,都要转到
conditionalJobStep1
. 所以你才明白1->3->2->1->3->2->1->...
.我不知道为什么会这样。这有什么区别?
当您用步骤3翻转步骤2时,它起作用,因为您已在步骤3的“*”上定义了一个结果:
.to(conditionalJobStep3()).on("*").end()
.我建议使用以下语法定义每个步骤的所有结果:
这是更明确的,更不容易忘记外向的过渡。