【发布时间】:2014-08-08 13:34:17
【问题描述】:
如何检查预定的 Quartz cron 作业是否正在运行?是否有任何 API 可以进行检查?
【问题讨论】:
-
我们可以通过 nagios 检查吗?
标签: java cron quartz-scheduler scheduler job-scheduling
如何检查预定的 Quartz cron 作业是否正在运行?是否有任何 API 可以进行检查?
【问题讨论】:
标签: java cron quartz-scheduler scheduler job-scheduling
如果您注意到 QUARTZ_TRIGGERS 表中有一个 TRIGGER_STATE 列。这会告诉您特定作业的触发器 (TriggerState) 的状态。您的应用很可能没有与此表的直接接口,但石英调度程序有,您可以通过以下方式检查状态:
private Boolean isJobPaused(String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobDetail.getKey());
for (Trigger trigger : triggers) {
TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
if (TriggerState.PAUSED.equals(triggerState)) {
return true;
}
}
return false;
}
【讨论】:
scheduler.getCurrentlyExecutingJobs() 在大多数情况下应该可以工作。但切记不要在 Job 类中使用,因为它使用 ExecutingJobsManager(a JobListener) 将正在运行的作业放到一个 HashMap 中,该 HashMap 在作业类之前运行,因此使用该方法检查作业是否正在运行肯定会返回 true。一种简单的方法是检查触发时间是否不同:
public static boolean isJobRunning(JobExecutionContext ctx, String jobName, String groupName)
throws SchedulerException {
List<JobExecutionContext> currentJobs = ctx.getScheduler().getCurrentlyExecutingJobs();
for (JobExecutionContext jobCtx : currentJobs) {
String thisJobName = jobCtx.getJobDetail().getKey().getName();
String thisGroupName = jobCtx.getJobDetail().getKey().getGroup();
if (jobName.equalsIgnoreCase(thisJobName) && groupName.equalsIgnoreCase(thisGroupName)
&& !jobCtx.getFireTime().equals(ctx.getFireTime())) {
return true;
}
}
return false;
}
还要注意,此方法不支持集群。也就是说,它只会返回当前在此调度器实例中执行的作业,而不是跨整个集群。如果你在集群中运行 Quartz,它将无法正常工作。
【讨论】:
你看过这个answer吗?尝试:
【讨论】:
String group = context.getJobDetail().getGroup();