【问题标题】:Spring batch, check jobExecution status after running the job directly?Spring批处理,直接运行job后检查jobExecution状态?
【发布时间】:2021-04-11 01:48:10
【问题描述】:

我有 2 个工作,我必须根据 job1 的状态启动 job2。 拨打以下电话是否正确:

        JobExecution jobExecution1 = jobLauncher.run(job1, jobParameters1);
        
        if(jobExecution1.getStatus()== BatchStatus.COMPLETED){
          JobExecution jobExecution2 = jobLauncher.run(job2, jobParameters2);
        }

我怀疑最初的jobexecution1 状态在检查条件时可能不是最终状态。 如果有人能解释更多关于你的过程,那就太好了

提前致谢。

【问题讨论】:

    标签: spring-boot spring-batch batch-processing


    【解决方案1】:

    这取决于您在JobLauncher 中配置的TaskExecutor 实现:

    • 如果任务执行器是同步的,则第一个作业将运行直到完成(成功或失败),然后再启动第二个作业。在这种情况下,您的代码是正确的。
    • 如果任务执行器是异步的,那么调用JobExecution jobExecution1 = jobLauncher.run(job1, jobParameters1); 将立即返回,此时jobExecution1 的状态将是未知的。这意味着在启动 job1 后立即检查它的状态作为启动 job2 的条件是不正确的(job1 将在单独的线程中运行,并且在那时仍然可以运行)。

    默认情况下,Spring Batch 在JobLauncher 中配置一个同步任务执行器。

    【讨论】:

      【解决方案2】:
      There are multiple ways. We are using below option by chaining jobs by decider. Below is the code snippet . Please let me know if you face any issues.
      
      
      public class MyDecider implements JobExecutionDecider {
      
          @Override
          public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
              
              String exitCode = new Random().nextFloat() < .70f ? "CORRECT":"INCORRECT";
              return new FlowExecutionStatus(exitCode);
          }
      
      }
      
      @Bean
          public JobExecutionDecider myDecider() {
              return new MyDecider();
          }
      
          @Bean
          public Job myTestJob() {
              return this.jobBuilderFactory.get("myTestJob")
                      .start(step1())
                      .next(step2())
                          .on("FAILED").to(step3())
                      .from(step4())
                          .on("*").to(myDecider())
                              .on("PRESENT").to(myNextStepOrJob)
                                  .next(myDecider()).on("CORRECT").to(myNextStepOrJob())
                                  .from(myDecider()).on("INCORRECT").to(myNextStepOrJob())
                          .from(decider())
                              .on("NOT_PRESENT").to(myNextStepOrJob())
                      .end()
                      .build();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 2016-10-23
        • 1970-01-01
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多