2014-06-18 12 views

Antwort

3

scheduler.getCurrentlyExecutingJobs() sollte in den meisten Fällen funktionieren. Aber denken Sie daran, es nicht in der Job-Klasse zu verwenden, denn es verwendet den ExecutingJobsManager (einen JobListener), um den laufenden Job in eine HashMap zu stellen, die vor der Jobklasse ausgeführt wird. Ein einfacher Ansatz besteht darin, zu überprüfen, ob die Feuerzeiten unterschiedlich sind:

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

Beachten Sie auch, dass diese Methode nicht Cluster-bewusst ist. Das heißt, es werden nur Jobs zurückgegeben, die gerade in dieser Scheduler-Instanz ausgeführt werden, nicht über den gesamten Cluster. Wenn Sie Quartz in einem Cluster ausführen, funktioniert es nicht ordnungsgemäß.

+1

gibt es keine Möglichkeit, es in einem Quartz-Cluster zu tun? –

1

Haben Sie sich diese answer angesehen? Versuchen Sie, mit:

scheduler.getCurrentlyExecutingJobs()

+0

Ich möchte nicht alle laufenden Jobs auflisten. Ich werde {jobid, jobgroup} zur Verfügung stellen. also hängt von meiner Eingabe ich sollte das Ergebnis bekommen. – kusumat

+0

Diese Methode gibt eine Liste von JobExecutionContext zurück. Sie können über diese Liste iterieren und nur die Elemente auswählen, die der von Ihnen angegebenen ID und Gruppe entsprechen. Um die Gruppe zu erhalten, können Sie Folgendes tun: 'String group = context.getJobDetail(). GetGroup();' – rafaborrego

+0

wie vorgeschlagen, können Sie das Ergebnis aus dem Scheduler einfach durch den Methodenaufruf überprüfen und suchen nach Jobkey oder Jobdetail – Acewin

2

Wenn Sie in der Tabelle QUARTZ_TRIGGERS feststellen, gibt es eine Spalte TRIGGER_STATE. Dies zeigt Ihnen den Status des Triggers (TriggerState) für einen bestimmten Job an. Aller Wahrscheinlichkeit nach hat Ihre App keine direkte Schnittstelle zu dieser Tabelle, aber der Quartz-Scheduler tut dies und Sie können den Status auf diese Weise überprüfen: