web-dev-qa-db-fra.com

Comment vérifier si le travail cron Quartz est en cours d'exécution?

Comment vérifier si le travail cron Quartz planifié est en cours d'exécution ou non? Existe-t-il une API pour effectuer la vérification?

12
kusumat

scheduler.getCurrentlyExecutingJobs () devrait fonctionner dans la plupart des cas. Mais n'oubliez pas de ne pas l'utiliser dans la classe Job, car il utilise ExecutingJobsManager (un JobListener) pour placer le travail en cours d'exécution sur une HashMap, qui s'exécute avant la classe de travail, donc utilisez cette méthode pour vérifier que le travail est en cours d'exécution retournera certainement true. Une approche simple consiste à vérifier que les temps d'incendie sont différents:

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

Notez également que cette méthode n'est pas compatible avec les clusters. En d'autres termes, il ne renverra que les travaux en cours d'exécution dans cette instance du planificateur, et non sur l'ensemble du cluster. Si vous exécutez Quartz dans un cluster, cela ne fonctionnera pas correctement.

7
arganzheng

Si vous remarquez dans la table QUARTZ_TRIGGERS, il y a une colonne TRIGGER_STATE. Cela vous indique l'état du déclencheur ( TriggerState ) pour un travail particulier. Selon toute vraisemblance, votre application n'a pas d'interface directe avec cette table, mais le planificateur de quartz en a et vous pouvez vérifier l'état de cette façon:

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

Avez-vous regardé cela réponse ? Essayez avec:

scheduler.getCurrentlyExecutingJobs ()

1
rafaborrego