【问题标题】: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();
}