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

Java 如何检查Quartz cron作业是否正在运行?,java,cron,quartz-scheduler,scheduler,job-scheduling,Java,Cron,Quartz Scheduler,Scheduler,Job Scheduling,如何检查计划的Quartz cron作业是否正在运行?是否有任何API来执行检查?您看过这个吗?尝试: scheduler.getCurrentlyExecutingJobs()在大多数情况下都可以工作。但请记住不要在作业类中使用它,因为它使用ExecutingJobsManager(JobListener)将正在运行的作业放置到HashMap,该HashMap在作业类之前运行,因此使用此方法检查作业是否正在运行肯定会返回true。一种简单的方法是检查点火时间是否不同: public stat

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

您看过这个吗?尝试:


scheduler.getCurrentlyExecutingJobs()在大多数情况下都可以工作。但请记住不要在作业类中使用它,因为它使用ExecutingJobsManager(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;
}
公共静态布尔值isJobRunning(JobExecutionContext ctx、字符串jobName、字符串groupName)
抛出ScheduleException{
List currentJobs=ctx.getScheduler().GetCurrentlyExecutionJobs();
对于(JobExecutionContext jobCtx:currentJobs){
字符串thisJobName=jobCtx.getJobDetail().getKey().getName();
字符串thisGroupName=jobCtx.getJobDetail().getKey().getGroup();
if(jobName.equalsIgnoreCase(thisJobName)&&groupName.equalsIgnoreCase(thisGroupName)
&&!jobCtx.getFireTime().equals(ctx.getFireTime())){
返回true;
}
}
返回false;
}

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

如果您注意到Quartz\u触发器表中有一个触发器状态列。这将告诉您特定作业的触发器()的状态。很可能您的应用程序没有与此表的直接接口,但quartz scheduler有,您可以通过以下方式检查状态:

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;
}
private Boolean isJobPaused(字符串jobName)引发ScheduleException{
JobKey JobKey=新的JobKey(jobName);
JobDetail JobDetail=scheduler.getJobDetail(jobKey);

列表我不想列出所有正在运行的作业。我将提供{jobid,jobgroup}。因此,根据我的输入,我应该得到结果。该方法返回JobExecutionContext的列表。您可以迭代该列表,只选择与您提供的id和组匹配的元素。要获得组,可以执行以下操作:
String group=context.getJobDetail().getGroup()
正如建议的那样,您可以通过方法调用和按jobkey或JobDetail搜索轻松检查调度程序的结果。在Quartz群集中有没有办法这样做?我们可以通过nagios检查来完成吗?触发器历史记录如何?我想我需要一个插件或通用侦听器来实现自己。这在群集设置中对我很有效