2011-11-23 74 views
1

我們需要Java EE服務器中的計劃作業,並知道如何使用Quartz或Timer服務。動態更改計時器服務或Quartz

但我們的問題是,如果我們想改變生產計劃或手動觸發批次,該怎麼做?

在傳統的解決方案中,我們使用servlet來運行作業。然後使用帶有一個http客戶端(即lynx)的cronjob來觸發該servlet。這很容易實施,並可能改變生產。

+0

你在問關於更改cron表達式嗎?如果適用,您可以使用調用'rescheduleJob'的JMX MBean偵聽器。 – zeller

回答

0

我從來沒有發現定時器完全令人滿意,因爲這個問題確實存在:您無法真正監控其狀態或修改它們。

我推薦的是第二層作業管理器類。當你調用這個類時,它調度Java EE定時器的時間'X',並且它還記錄了你想在'X'時刻執行'job'的事實。到達該時間後,Java EE計時器將調用此作業管理器類,該類可找到作業並調用作業。

這可以讓你做的是編寫一個「不定期」功能。調用不調度將刪除該作業。當Java EE計時器在時間「X」處調用時,此類未找到任何作業,因此忽略它。

您還可以實現刪除舊條目的「更改時間表」函數,並在'Y'時間安排Java EE計時器的時間'Y'時創建一個新條目。 Java EE計時器將在'Y'時間到達'X'和另一個時間,但只有'Y'時間纔會生效。

因此,手動觸發就是讓一個叫做「更改時間表」的小服務程序立即啓動。

需要注意的另一個細節:因爲計時器事件不是完全可靠的,我們實現這個類來查找在當前時間之前計劃的所有作業,並在那一刻運行所有作業。然後,我們每5分鐘左右安排額外的Java EE計時器事件。那些計時器將會選擇出於某種原因而被拋棄的任何工作。如果你的作業隊列是持久的,那麼這很重要,那麼在重啓服務器的時候,它可能正好在計時器應該關閉的時刻關閉。沒問題:Java EE Timer事件本身沒有意義,它們只是用來喚醒作業處理程序,因此它可以運行所有過時的作業。