Apache Quartz,如何从作业执行上下文中获取或计算先前的计划点火时间?

时间:2018-08-21 15:08:09

标签: java triggers quartz-scheduler

使用Quartz 2.3.0

标题要求:
是否可以通过Job.execute(JobExecutionContext context)方法获取或计算Quartz触发器的先前计划的触发时间?

我知道我可以使用JobExecutionContext.getScheduledFireTime()来获取当前触发该触发器的计划时间,但是我想要 previous 触发的计划时间。换一种说法:getFireTime()getScheduledFireTime()就像getPreviousFireTime()是什么?

我正在使用JobStoreTX,需要保持数据库不可知;覆盖所有JDBC委托和Job Store实现来存储和公开先前计划的启动时间是非常痛苦的。

最接近的是某些Trigger实现(例如SimpleTriggerImpl)具有方法:

/**
 * <p>
 * Returns the last time at which the <code>SimpleTrigger</code> will
 * fire, before the given time. If the trigger will not fire before the
 * given time, <code>null</code> will be returned.
 * </p>
 */
public Date getFireTimeBefore(Date end);

但是CronTriggerImpl有:

/**
 * NOT YET IMPLEMENTED: Returns the time before the given time
 * that this <code>CronTrigger</code> will fire.
 */ 
protected Date getTimeBefore(Date eTime) {
    return (cronEx == null) ? null : cronEx.getTimeBefore(eTime);
}

不幸的是,我将主要使用CronTrigger,并且Trigger界面中没有这样的方法。

有什么想法吗?

谢谢。


我的备份想法是,在每次作业执行开始时,从一个单独的表中以事务方式读取先前的计划时间,并将新的当前计划时间写入到由SchedulerName,TriggerGroup和TriggerName索引的表中。