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

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

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

  1. @Bean
  2. public Step conditionalJobStep1() {
  3. return stepBuilderFactory.get("step1")
  4. .tasklet((contribution, chunkContext) -> {
  5. log.info(">>>>> This is stepNextConditionalJob Step1");
  6. return RepeatStatus.FINISHED;
  7. }).build();
  8. }
  9. @Bean
  10. public Step conditionalJobStep2() {
  11. return stepBuilderFactory.get("conditionalJobStep2")
  12. .tasklet((contribution, chunkContext) -> {
  13. log.info(">>>>> This is stepNextConditionalJob Step2");
  14. return RepeatStatus.FINISHED;
  15. }).build();
  16. }
  17. @Bean
  18. public Step conditionalJobStep3() {
  19. return stepBuilderFactory.get("conditionalJobStep3")
  20. .tasklet((contribution, chunkContext) -> {
  21. log.info(">>>>> This is stepNextConditionalJob Step3");
  22. return RepeatStatus.FINISHED;
  23. }).build();
  24. }

下面是步骤和微线程。

  1. @Bean
  2. public Job stepNextConditionalJob() {
  3. return jobBuilderFactory.get("stepNextConditionalJob")
  4. .start(conditionalJobStep1())
  5. .on("FAILED")
  6. .to(conditionalJobStep3())
  7. .on("*")
  8. .end()
  9. .from(conditionalJobStep1())
  10. .on("*")
  11. .to(conditionalJobStep3())
  12. .next(conditionalJobStep2())
  13. .on("*")
  14. .to(conditionalJobStep1())
  15. .on("*")
  16. .end()
  17. .end()
  18. .build();
  19. }

以上代码结果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。

  1. @Bean
  2. public Job stepNextConditionalJob() {
  3. return jobBuilderFactory.get("stepNextConditionalJob")
  4. .start(conditionalJobStep1())
  5. .on("FAILED")
  6. .to(conditionalJobStep3())
  7. .on("*")
  8. .end()
  9. .from(conditionalJobStep1())
  10. .on("*")
  11. .to(conditionalJobStep2())
  12. .next(conditionalJobStep3())
  13. .on("*")
  14. .to(conditionalJobStep1())
  15. .on("*")
  16. .end()
  17. .end()
  18. .build();
  19. }

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

bgtovc5b

bgtovc5b1#

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

  1. .to(conditionalJobStep3())
  2. .on("*")
  3. .end()

  1. .to(conditionalJobStep1())
  2. .on("*")
  3. .end()

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

  1. .next(conditionalJobStep2())
  2. .on("*")
  3. .to(conditionalJobStep1())

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

  1. jobBuilderFactory.get("stepNextConditionalJob")
  2. .from(stepA).on(ExitCode1).to(StepB)
  3. .from(stepA).on(ExitCode2).to(StepC)
  4. .from(stepA).on("*").end()
  5. ...
  6. .from(stepX).on(ExitCode1).to(StepY)
  7. .from(stepX).on(ExitCode1).to(StepZ)
  8. .from(stepX).on("*").end()
  9. .build()

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

展开查看全部

相关问题