Как проверить, выполняется ли задание Quartz cron?

Как проверить, выполняется запланированное задание Quartz cron или нет? Есть ли API для проверки?

3 ответа

Решение

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

Также обратите внимание, что этот метод не поддерживает кластер. То есть он будет возвращать только задания, выполняемые в данный момент в этом экземпляре планировщика, а не по всему кластеру. Если вы запустите Quartz в кластере, он не будет работать должным образом.

Если вы заметили в таблице 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;
}

Вы смотрели на этот ответ? Попробуйте с:

scheduler.getCurrentlyExecutingJobs ()

Другие вопросы по тегам