2010-09-02 56 views
1

我在我的java程序中使用Quartz Cron觸發器。我使用的Cron表達式是0 0 * * *?Java Quartz Cron觸發器

現在我想要一個調度程序每小時執行一次。爲了測試相同的啓動我的JBoss服務器,之後我重置我的Windows時間像5:59:45和6:00:00調度程序沒有觸發。

現在下次我第一次調整時間說5:55:00,然後我啓動了服務器,並在6:00:00啓動調度器。

服務器或調度程序是否在內部維護時間,當然是用系統時間初始化?

+0

您是否將事件存儲在數據庫中? – khmarbaise 2010-09-02 13:16:43

回答

5

根據Quartz CronTrigger source code,觸發器保留下次應該觸發的日期。

我想如果你在6點15分開始服務器,Quartz會保留7:00:00作爲下一次點火時間。將服務器時間更改爲5:55:45不會更新下一次開火時間,並且7:00:00將保留爲下一次開火時間。因此,事件不會在6:00:00開始,而是在7:00:00開始。

因此,時間不會被直接保留,但會保留開火時間,而且如果您更改系統時鐘,則不會更新開火時間。

1

如果您使用JDBC作業存儲,石英會以一分鐘的時間間隔檢查數據庫,以使用當前系統時間查找現在要運行的作業。

當您向前移動系統時間時,石英將在下次檢查時觸發適當的作業(即在一分鐘內)。

+0

這也是我的理解,我使用jdbc jobStore,但如果我將系統時間向前移動,則觸發器不會觸發。如果你有一個很好的理解,請在這裏回答:https://stackoverflow.com/questions/40245113/quartz-scheduler-testing-scenario-not-working – Gurkha 2016-10-25 16:49:54

0

我也面臨同樣的問題,解決這個問題是:

表述是指0 0 * * *?即秒,分,小時,月,月,星期幾。所以在每一天,每個月,每一週的每一個小時的開始,以及無論是哪一年。

這個表達式只是聲明你想在你的服務器啓動之前記錄下你的工作和每個小時的時間,因此如果在服務器啓動時間到達任何小時的時間之前,它會觸發下一小時時間例如 -

1。您在5:55啓動服務器,但服務器花了7分鐘啓動,因此時間超過6:00超過2分鐘,因此下一次啓動時間將爲7:00

2。但是如果你的服務器在5:59:59成功啓動,那麼肯定會在6點啓動,因爲調度程序應該在每個小時的開始時運行,服務器在6點鐘之前就準備好了。

注意:在服務器啓動後,在窗口上更改時間不會使時間表運行,因爲時間服務器運行時會記錄時間。