在我的Java EE 7应用程序中,我创建了一个每小时运行一次的持久计划任务。我使用过@Schedule注释。
当调用此作业时,我想对从最后一小时到现在发生的事件执行一些操作。为了获得现在我使用" new Date()"。
这个@Schedule具有" true"的默认持久属性,这很好,因为如果服务器在几小时内停止,我想在重新启动时执行这些任务。
问题在于,如果服务器在5个小时内停止,则作业将启动5次,但在所有执行中"新的Date()"将被执行,结果将是相同的。
有没有办法检索应该启动@Schedule作业的日期???
答案 0 :(得分:3)
有没有办法检索应该启动@Schedule作业的日期???
我认为答案是否定的,没有。
specification定义了必须由Container实现的三个接口。 这些界面是:TimerService,Timer和TimerHandle。 如您所见,其中没有人(特别是Timer)公开该方法 你需要的。因此,不强制Java EE兼容服务器实现此行为。
您可能应该自己实施一个提供此要求的解决方案。 例如,您可以在最后一个回调方法时存储时间戳 执行并使用此时间戳确定时间段(而不是减去1小时到当前日期)
...如果服务器在5小时内停止,该作业将启动5次......
请注意,您不能依赖此
18.4.3定时器到期和超时回调方法 ...在介入期间已过期的任何间隔持久定时器或基于调度的持久定时器 time必须在重启时调用相应的超时回调方法至少一次。
答案 1 :(得分:1)
您可以使用javax.ejb.Timer重建实际运行计时器的时间:
@Timeout
public void timeout(Timer timer) {
// get next time
Date nextTime = timer.getNextTimeout();
// substract 1 hour
Calendar c = Calendar.getInstance();
c.setTime(timer.getNextTimeout());
c.add(Calendar.HOUR_OF_DAY, -1);
Date actualTimerDate = c.getTime();
}