![](/img/trans.png)
[英]Seam Quartz Dispatcher not firing on seconds and minutes field for a given cron expression
[英]About firing of missed scheduled Cron expression in quartz?
假設我有Cron表達式,例如0 0 12 1/1 *? *由於某些原因,在這種情況下服務器在11:50到12:05之間停止,並在12:05之后再次啟動,因此在服務器啟動后如何激發錯過的計划Cron表達式? 石英有什么解決方案可以解決上述問題。
看見石英文檔教程或此為“失火說明”是從石英觸發器用於恢復錯過作業執行政策的大文章。
如果要容忍服務器關閉/崩潰,則需要配置Quartz以使用持久性Job Store來像JDBCJobStore一樣“記住”崩潰之前的最后一個作業執行。
我也曾經遇到過要在服務器重新啟動時運行上一個計划的作業的問題。
我發現的解決方案是返回觸發器的一個時間間隔,然后計算下一次觸發時間。 通過遍歷所有觸發器,可以確定觸發器過去應該觸發的最近時間。
計算兩次點火之間的間隔:
Date nextFireTime = trigger.getNextFireTime();
Date subsequentFireTime = trigger.getFireTimeAfter(nextFireTime);
long interval = subsequentFireTime.getTime() - nextFireTime.getTime();
找到一次直到下一次間隔的下一次點火時間:
Date previousPeriodTime = new Date(System.currentTimeMillis() - interval);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
我發現如果您使用的是CronTrigger
這可以防止您過去要求開火時間。 要解決此問題,我修改了開始時間,因此以上代碼段變為:
Date originalStartTime = trigger.getStartTime(); // save the start time
Date previousPeriodTime = new Date(originalStartTime.getTime() - interval);
trigger.setStartTime(previousPeriodTime);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
trigger.setStartTime(originalStartTime); // reset the start time to be nice
遍歷所有觸發器,並找到過去最近的觸發器:
for (String groupName : scheduler.getTriggerGroupNames()) {
for (String triggerName : scheduler.getTriggerNames(groupName)) {
Trigger trigger = scheduler.getTrigger(triggerName, groupName);
// code as detailed above...
interval = ...
previousFireTime = ...
}
}
可以將此代碼重構為輔助方法或類。 我實際上在子類委派觸發器中使用了上述算法,然后將其放入按先前觸發時間排序的集合中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.