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

时间:2014-06-18 09:52:45

标签: java cron quartz-scheduler scheduler job-scheduling

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

3 个答案:

答案 0 :(得分:6)

在大多数情况下,

scheduler.getCurrentlyExecutingJobs()应该有效。但请记住不要在Job类中使用它,因为它使用ExecutingJobsManager(一个JobListener)将正在运行的作业放到一个在作业类之前运行的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;
}

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

答案 1 :(得分:6)

如果您注意到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 :(得分:1)

你看过这个answer了吗?试试:

  

scheduler.getCurrentlyExecutingJobs()

相关问题