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

Posted

技术标签:

【中文标题】如何检查 Quartz cron 作业是不是正在运行?【英文标题】:How to check whether Quartz cron job is running?如何检查 Quartz cron 作业是否正在运行? 【发布时间】:2014-08-08 13:34:17 【问题描述】:

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

【问题讨论】:

我们可以通过 nagios 检查吗? 【参考方案1】:

如果您注意到 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;

【讨论】:

触发历史呢?我想我需要一个插件或通用侦听器来实现自己..【参考方案2】:

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,它将无法正常工作。

【讨论】:

有没有办法在 Quartz 集群中做到这一点?【参考方案3】:

你看过这个answer吗?尝试:

scheduler.getCurrentlyExecutingJobs()

【讨论】:

我不想列出所有正在运行的作业。我将提供 jobid, jobgroup。所以取决于我的输入,我应该得到结果。 该方法返回一个 JobExecutionContext 列表。您可以遍历该列表并仅选择与您提供的 id 和 group 匹配的元素。获取组可以这样做:String group = context.getJobDetail().getGroup(); 按照建议,您可以通过方法调用轻松查看调度程序的结果,并通过jobkey或jobdetail进行搜索

以上是关于如何检查 Quartz cron 作业是不是正在运行?的主要内容,如果未能解决你的问题,请参考以下文章

Quartz Scheduler作业在触发后连续运行

如何在没有像 Quartz Clustering 这样的集中式解决方案的情况下在分布式环境中实现 cron 作业/计划作业? [复制]

初识Quartz

如何使用 Quartz.Net 开始计划作业?

如何在 AIX 中监视没有 cron 作业的文件更改

java Quartz Scheduler cron 表达式每隔 30 分钟后一刻钟