2014-06-18 17 views

Odpowiedz

3

scheduler.getCurrentlyExecutingJobs() powinny działać w większości przypadków. Ale pamiętaj, aby nie używać go w klasie Job, ponieważ używa ExecutingJobsManager (JobListener), aby umieścić uruchomione zadanie w HashMap, która jest uruchamiana przed klasą zadania, więc użyj tej metody, aby sprawdzić, czy zadanie działa, na pewno zwróci true. Jednym prostym podejściem jest sprawdzenie, czy czasy pożaru są różne:

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

Zauważ, że ta metoda nie działa w trybie klastrowym. Oznacza to, że zwróci on tylko zadania aktualnie wykonywane w tej instancji Scheduler, a nie w całym klastrze. Jeśli uruchomisz kwarc w klastrze, nie będzie działać poprawnie.

+1

czy jest jakiś sposób zrobić to w klastrze kwarcowym? –

1

Czy spojrzałeś na to answer? Spróbuj:

scheduler.getCurrentlyExecutingJobs()

+0

Nie chcę wyświetlać wszystkich uruchomionych zadań. Przekażę {jobid, grupa robocza}. więc zależy od mojego wejścia i powinien otrzymać wynik. – kusumat

+0

Ta metoda zwraca listę JobExecutionContext. Możesz powtórzyć tę listę i wybrać tylko te elementy, które pasują do podanego identyfikatora i grupy. Aby uzyskać grupę, którą możesz wykonać: 'String group = context.getJobDetail(). GetGroup();' – rafaborrego

+0

zgodnie z sugestią, możesz łatwo sprawdzić wynik z terminarza przez wywołanie metody i wyszukiwanie przez jobkey lub jobdetail – Acewin

2

Jeśli zauważysz w tabeli QUARTZ_TRIGGERS, istnieje kolumna TRIGGER_STATE. Informuje o stanie wyzwalacza (TriggerState) dla określonego zadania. Najprawdopodobniej Twoja aplikacja nie ma bezpośredniego interfejsu do tej tabeli, ale harmonogram kwarcowy działa i możesz sprawdzić stan w następujący sposób:

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; 
} 
Powiązane problemy