2013-02-22 905 views
6

我收到調度如下:Quartz - 如何關閉並重新啓動調度程序?

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

後來

schedulerBean.shutdown(); 
執行一些其他的代碼後

,那麼我()再次調用schedulerBean.start。

現在的代碼拋出的錯誤 - 「org.quartz.SchedulerException:調度程序不能關機之後重新啓動()被稱爲」

可否請你讓我知道如何解決這個問題呢?

由於提前, 本Kathir

回答

7

一旦你關閉一調度,它不能被重新啓動線程和其他資源的永久破壞。

您可以閱讀Quartz Scheduler API references以找到滿足您需求的方法。在下面你可以找到一些可用的方法。

  • standby()方法。暫時停止調度程序觸發觸發器。當調用start()(使調度器退出待機模式)時,在執行start()方法期間不會觸發失火指令 - 之後會立即檢測到任何失火(通過JobStore的正常過程) 。
  • pauseJob(JobKey jobKey) - resumeJob(JobKey jobKey)。用給定的鍵暫停JobDetail - 暫停所有當前的觸發器。在resumeJob(JobKey jobKey)上,如果Job的任何觸發器錯過了一個或多個觸發時間,那麼觸發器的失火指令將被應用。
  • interrupt(JobKey jobKey)。請求在此調度程序實例內中斷所標識的作業的所有當前正在執行的實例,該實例必須是InterruptableJob接口的實現者。如果當前執行的標識作業有多個實例,則將在每個實例上調用InterruptableJob#interrupt()方法。但是,如果一個實例的interrupt()引發異常,則所有剩餘的實例(尚未中斷)都不會調用其interrupt()方法,這是有限制的。如果您希望中斷某個作業的特定實例(當執行多個作業時),可以通過調用getCurrentlyExecutingJobs()來獲取作業實例的句柄,然後自行調用interrupt()來完成。此方法不支持羣集。也就是說,它只會中斷當前在此計劃程序實例中執行的InterruptableJob的實例,而不會跨整個羣集。
  • unscheduleJob(TriggerKey triggerKey)。從調度程序中刪除指示的觸發器。如果相關作業沒有任何其他觸發器,且作業不耐用,則作業也將被刪除。

注意,您可以創建一個實現了ServletContextListener接口的監聽器,因此:

  • 所有的工作都被中斷,並且調度是關機當容器被關閉
  • 創建調度並且當容器啓動時計劃作業

如果你想創建這樣的監聽器,我可以提供更多的細節。

我希望這會有所幫助。

+1

standby和start()解決了這個問題。感謝細節。 (http://my.safaribooksonline.com/book/operating-systems-and-server-administration/0131886703/hello-quartz/ch03lev1sec2) – Kathir 2013-02-25 04:28:25

+0

只調用scheduler.standby(),然後scheduler.start()不起作用。 – aloplop85 2013-11-08 13:36:39

+0

您能否提供有關如何編寫ServletContextListener以中斷正在運行的所有作業並請求他們採取某些操作的詳細信息。 – Vipul 2014-03-25 10:55:35

相關問題