在
CronTrigger通过记住的作品
nextFireTime。创建触发器后,将对其
nextFireTime进行初始化。每次触发作业
nextFireTime都会更新。由于暂停时未触发作业,因此
nextFireTime保持“旧”状态。因此,恢复作业后,触发器将返回每个旧的触发器时间。
问题是,触发器不知道它已被暂停。为了克服这个问题,进行了不点火处理。恢复作业后,
updateAfterMisfire()将调用触发器的方法来更正
nextFireTime。但是,如果
nextFireTime和现在之间的差小于misfireThreshold,则不是这样。这样就永远不会调用该方法。此阈值的默认值为60,000。因此,如果您的暂停时间超过60s,一切都会好起来的。
由于您有问题,我认为没有。;)要解决此问题,您可以修改阈值或在周围使用简单的包装器
CronTrigger:
public class PauseAwareCronTrigger extends CronTrigger { // constructors you need go here @Override public Date getNextFireTime() { Date nextFireTime = super.getNextFireTime(); if (nextFireTime.getTime() < System.currentTimeMillis()) { // next fire time after now nextFireTime = super.getFireTimeAfter(null); super.setNextFireTime(nextFireTime); } return nextFireTime; }}


