Spring批处理,直接检查运行作业后的作业执行状态?

Spring batch, check jobExecution status after running the job directly?

我有 2 个作业,我必须根据作业 1 的状态启动作业 2。 进行以下调用是否正确:

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

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

提前致谢。

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

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

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

默认情况下,Spring批处理在JobLauncher.

配置一个同步任务执行器