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
.
配置一个同步任务执行器
我有 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
.