如何检查调度的quartz cron作业是否正在运行?是否有api来进行检查?
xfyts7mz1#
在大多数情况下,scheduler.getcurrentlyexecutingjobs()应该可以工作。但是记住不要在job类中使用它,因为它使用executingjobsmanager(joblistener)将正在运行的作业放到hashmap中,hashmap在job类之前运行,因此使用此方法检查job is running肯定会返回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,它将无法正常工作。
5f0d552i2#
你看过这个答案了吗?尝试使用:scheduler.getcurrentlyexecutingjobs()
lokaqttq3#
如果您注意到quartz\u triggers表中有一个trigger\u state列。这将告诉您特定作业的触发器状态(triggerstate)。很可能您的应用程序没有与此表的直接接口,但quartz调度程序有,您可以通过以下方式检查状态:
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; }
3条答案
按热度按时间xfyts7mz1#
在大多数情况下,scheduler.getcurrentlyexecutingjobs()应该可以工作。但是记住不要在job类中使用它,因为它使用executingjobsmanager(joblistener)将正在运行的作业放到hashmap中,hashmap在job类之前运行,因此使用此方法检查job is running肯定会返回true。一种简单的方法是检查火灾时间是否不同:
还要注意,这个方法不支持集群。也就是说,它将只返回当前在此调度程序示例中执行的作业,而不返回整个集群中的作业。如果在集群中运行quartz,它将无法正常工作。
5f0d552i2#
你看过这个答案了吗?尝试使用:
scheduler.getcurrentlyexecutingjobs()
lokaqttq3#
如果您注意到quartz\u triggers表中有一个trigger\u state列。这将告诉您特定作业的触发器状态(triggerstate)。很可能您的应用程序没有与此表的直接接口,但quartz调度程序有,您可以通过以下方式检查状态: