一些作业比我们的调度程序间隔运行的时间更长 . 跳过这些工作是非常安全的 . 如何检测具有相同名称和参数(运行时间除外)的作业当前是否正在运行?
Quartz运行Batch作业:
import org.springframework.batch.core.JobParametersBuilder;
@Override
protected void executeInternal(org.quartz.JobExecutionContext context) {
Map<String, Object> jobDataMap = context.getMergedJobDataMap();
String jobName = (String) jobDataMap.get("job.name");
JobParametersBuilder builder = new JobParametersBuilder();
builder.addString("company", jobDataMap.get("company"));
builder.addDate("run.date", new Date());
try {
jobLauncher.run(jobLocator.getJob(jobName), jobParametersBuilder.toJobParameters());
}
catch (JobExecutionException e) {
log.error("Could not execute job.", e);
}
}
我需要查找是否正在运行特定 "job.name"
/ "company"
(无论 "run.date"
)的任何执行 .
我可以使用针对 BATCH_
表运行的纯SQL来实现这一点 .
检查应该在Tasklet中运行,以便JobRepository可以自动连接 . 是否有可能只找到 JobRepository
或其他Spring Batch bean?
2 回答
您可以从识别中排除“run.date” .
使用公共
JobParameter(Date parameter, boolean identifying)
来自JobParameter的文档 .
所以只需添加没有
builder.addDate("run.date", new Date());
的参数并运行作业 .我的解决方案基于
JobExplorer.findRunningJobExecutions()
(找到最新未完成的工作):和决策者:
这个解决方案的缺点是
JobExplorer
解决了JobExecution中的每个字段(包括所有步骤) . 所以表现并不完美 . 但解决方案是可靠的 .