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

b4lqfgs4  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(477)

如何检查调度的quartz cron作业是否正在运行?是否有api来进行检查?

xfyts7mz

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

5f0d552i

5f0d552i2#

你看过这个答案了吗?尝试使用:
scheduler.getcurrentlyexecutingjobs()

lokaqttq

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;
}

相关问题