为什么这个条件批处理流包含在spring批处理的无限循环中?

zour9fqk  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(247)

我恶意地编写了一个代码来检查批处理流是如何工作的。

@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();
}

许多自己的实验都是在“开始”之后与“到”相关的。
我不知道为什么会这样。
这有什么区别?

bgtovc5b

bgtovc5b1#

您的流程没有定义上步骤2的结果 * . 您有:

.to(conditionalJobStep3())
.on("*")
.end()

.to(conditionalJobStep1())
.on("*")
.end()

但第二步没有这样的结构。您为步骤2定义的唯一结果是:

.next(conditionalJobStep2())
.on("*")
.to(conditionalJobStep1())

也就是说,不管第2步的退出代码是什么,都要转到 conditionalJobStep1 . 所以你才明白 1->3->2->1->3->2->1->... .
我不知道为什么会这样。这有什么区别?
当您用步骤3翻转步骤2时,它起作用,因为您已在步骤3的“*”上定义了一个结果: .to(conditionalJobStep3()).on("*").end() .
我建议使用以下语法定义每个步骤的所有结果:

jobBuilderFactory.get("stepNextConditionalJob")
   .from(stepA).on(ExitCode1).to(StepB)
   .from(stepA).on(ExitCode2).to(StepC)
   .from(stepA).on("*").end()
   ...
   .from(stepX).on(ExitCode1).to(StepY)
   .from(stepX).on(ExitCode1).to(StepZ)
   .from(stepX).on("*").end()
 .build()

这是更明确的,更不容易忘记外向的过渡。

相关问题