Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于在quartz中触发错过的定时Cron表达式?_Java_Quartz Scheduler - Fatal编程技术网

Java 关于在quartz中触发错过的定时Cron表达式?

Java 关于在quartz中触发错过的定时Cron表达式?,java,quartz-scheduler,Java,Quartz Scheduler,假设我有Cron表达式,比如0 12 1/1*?*由于某些原因,服务器在11:50到12:05之间停止,并在12:05之后再次启动。在这种情况下,我如何在服务器启动后启动错过的定时Cron表达式?quartz是否有任何解决方案来处理上述问题。请参阅quartz文档或文章中的“失火指令”,这些指令是quartz触发器用于恢复未执行的作业的策略。 如果希望容忍服务器关闭/崩溃,则需要将Quartz配置为使用持久作业存储,以便“记住”崩溃前的最后一次作业执行 更新:请参见解释如何创建可恢复作业的内容

假设我有Cron表达式,比如0 12 1/1*?*由于某些原因,服务器在11:50到12:05之间停止,并在12:05之后再次启动。在这种情况下,我如何在服务器启动后启动错过的定时Cron表达式?quartz是否有任何解决方案来处理上述问题。

请参阅quartz文档或文章中的“失火指令”,这些指令是quartz触发器用于恢复未执行的作业的策略。

如果希望容忍服务器关闭/崩溃,则需要将Quartz配置为使用持久作业存储,以便“记住”崩溃前的最后一次作业执行


更新:请参见解释如何创建可恢复作业的内容

我也遇到了希望在服务器重新启动时运行最后一个计划作业的问题

我找到的解决方案是返回触发器的一个时间间隔,并计算下一个触发时间。通过遍历所有触发器,可以确定过去应该触发的触发器的最近时间


计算每次点火之间的间隔:

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);
for (String groupName : scheduler.getTriggerGroupNames()) {
    for (String triggerName : scheduler.getTriggerNames(groupName)) {
        Trigger trigger = scheduler.getTrigger(triggerName, groupName);
        // code as detailed above...
        interval = ...
        previousFireTime = ...
    }
}
我发现,如果您使用的是
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
遍历所有触发器,并查找过去最近的触发器:

Date previousPeriodTime = new Date(System.currentTimeMillis() - interval);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
for (String groupName : scheduler.getTriggerGroupNames()) {
    for (String triggerName : scheduler.getTriggerNames(groupName)) {
        Trigger trigger = scheduler.getTrigger(triggerName, groupName);
        // code as detailed above...
        interval = ...
        previousFireTime = ...
    }
}

此代码可以重构为帮助器方法或类。实际上,我在一个子类委托触发器中使用了上述算法,然后将其放入按以前触发时间排序的集合中。

:感谢您的回复。当我使用下面的代码时,我们使用的是quartz-1.8.6 jar,我想有些类不在jar中。我必须更新更新的石英版本吗?trigger=newTrigger()。带标识(“trigger3”,“group1”)。带时间表(cronSchedule(“0 0/2 8-17**”))。forJob(“myJob”,“group1”)。build();非常感谢您的帮助。请编辑您的问题并添加一些代码和信息,以便我能更好地帮助您:)