繁体   English   中英

关于在石英中发射错过的预定Cron表达式?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM