2013-02-22 11 views
6

jestem coraz harmonogramu następująco:Kwarc - Jak zamknąć i ponownie uruchomić program planujący?

StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName); 
schedulerBean.start(); 

a później

schedulerBean.shutdown(); 

po wykonaniu kilku innych kodów, to jestem() ponownie wzywając schedulerBean.start.

Teraz kod wyrzuca błąd - „org.quartz.SchedulerException: Harmonogram nie może zostać wznowiona po wyłączeniu() została nazwana”

mógłbyś dać mi znać, jak rozwiązać ten problem?

Dzięki z góry, Kathir

Odpowiedz

7

Gdy masz zamknięcie harmonogram, to nie może być wznowiona jako nici i inne zasoby są trwale zniszczone.

Możesz przeczytać Quartz Scheduler API references, aby znaleźć metodę, która spełnia Twoje potrzeby. Poniżej znajdziesz kilka dostępnych metod. Metoda:

  • standby(). Tymczasowo zatrzymuje wyzwalanie wyzwalacza przez Schedulera. Po wywołaniu funkcji start() w celu wyłączenia programu planującego w trybie stand-by wyzwalanie instrukcji przerw zapłonu NIE zostanie zastosowane podczas wykonywania metody start() - wszelkie niewypały będą natychmiast wykrywane (przez normalny proces JobStore) .
  • pauseJob(JobKey jobKey) - resumeJob(JobKey jobKey). Zatrzymaj JobDetail za pomocą danego klucza - wstrzymując wszystkie bieżące wyzwalacze. Na resumeJob (JobKey jobKey), jeśli którykolwiek z Job's Trigger nie przeoczył jednego lub więcej czasów ostrzału, zostanie zastosowana instrukcja przerwania działania wyzwalacza.
  • interrupt(JobKey jobKey). Poproś o przerwanie w ramach tej instancji Scheduler wszystkich aktualnie wykonywanych wystąpień zidentyfikowanego zadania, które musi być implementatorem interfejsu InterruptableJob. Jeśli aktualnie wykonywana jest więcej niż jedna instancja zidentyfikowanego zadania, wywoływana jest metoda InterruptableJob # interrupt() dla każdej instancji. Istnieje jednak ograniczenie, że w przypadku, gdy interrupt() na jednym wystąpieniu zgłasza wyjątek, wszystkie pozostałe wystąpienia (które nie zostały jeszcze przerwane) nie będą wywoływać swojej metody interrupt(). Jeśli chcesz przerwać konkretną instancję zadania (gdy wykonuje więcej niż jeden), możesz to zrobić, wywołując metodę getCurrentlyExecutingJobs() w celu uzyskania uchwytu do instancji zadania, a następnie wywołaj metodę interrupt() samodzielnie. Ta metoda nie jest świadoma klastra. Oznacza to, że będzie ona przerywała tylko instancje zidentyfikowanego obiektu InterruptableJob aktualnie wykonywanego w tej instancji programu Scheduler, a nie w całym klastrze.
  • unscheduleJob(TriggerKey triggerKey). Usuń wskazany wyzwalacz z harmonogramu. Jeśli powiązane zadanie nie ma żadnych innych wyzwalaczy, a zadanie nie jest trwałe, to zadanie zostanie również usunięte.

pamiętać, że można stworzyć słuchacza, który implementuje interfejs ServletContextListener tak, że:

  • wszystkie zadania są przerywane i harmonogram jest wyłączanie, gdy pojemnik jest zamykany
  • harmonogram jest tworzony a zadania są zaplanowane, gdy kontener zostanie uruchomiony

Jeśli chciałbyś stworzyć takiego słuchacza, mógłbym podać więcej szczegółów.

Mam nadzieję, że to pomoże.

+1

tryb gotowości i start() rozwiązują problem. dzięki za szczegóły. (http://my.safaribooksonline.com/book/operating-systems-and-server-administration/0131886703/hello-quartz/ch03lev1sec2) – Kathir

+0

Wywołanie tylko scheduler.standby(), a następnie scheduler.start() nie działa. – aloplop85

+0

Czy możesz podać szczegóły dotyczące pisania ServletContextListener w celu przerwania wszystkich uruchomionych zadań i poprosić ich o podjęcie pewnych działań. – Vipul

Powiązane problemy