如何检查Quartz cron作业是否正在运行?

如何检查计划的Quartz cron作业是否正在运行? 有任何API可以进行检查吗?

scheduler.getCurrentlyExecutingJobs()在大多数情况下应该有效。 但请记住不要在Job类中使用它,因为它使用ExecutingJobsManager(一个JobListener)将正在运行的作业放到HashMap中,该HashMap在作业类之前运行,因此使用此方法检查作业正在运行肯定会返回true。 一种简单的方法是检查火灾时间是否不同:

public static boolean isJobRunning(JobExecutionContext ctx, String jobName, String groupName) throws SchedulerException { List 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; } 

另请注意,此方法不支持群集。 也就是说,它只返回当前在此Scheduler实例中执行的作业,而不是整个集群中的作业。 如果您在群集中运行Quartz,它将无法正常工作。

如果您在QUARTZ_TRIGGERS表中注意到,则存在TRIGGER_STATE列。 这将告诉您特定作业的触发器状态( TriggerState )。 很可能你的应用程序没有这个表的直接接口,但是石英调度程序没有,你可以这样检查状态:

 private Boolean isJobPaused(String jobName) throws SchedulerException { JobKey jobKey = new JobKey(jobName); JobDetail jobDetail = scheduler.getJobDetail(jobKey); List 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()