Java EE 7:设置为persistent = true时获取@Schedule日期

时间:2014-09-19 08:00:52

标签: java-ee schedule

在我的Java EE 7应用程序中,我创建了一个每小时运行一次的持久计划任务。我使用过@Schedule注释。

当调用此作业时,我想对从最后一小时到现在发生的事件执行一些操作。为了获得现在我使用" new Date()"。

这个@Schedule具有" true"的默认持久属性,这很好,因为如果服务器在几小时内停止,我想在重新启动时执行这些任务。

问题在于,如果服务器在5个小时内停止,则作业将启动5次,但在所有执行中"新的Date()"将被执行,结果将是相同的。

有没有办法检索应该启动@Schedule作业的日期???

2 个答案:

答案 0 :(得分:3)

  

有没有办法检索应该启动@Schedule作业的日期???

我认为答案是否定的,没有。

specification定义了必须由Container实现的三个接口。 这些界面是:TimerServiceTimerTimerHandle。 如您所见,其中没有人(特别是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();
}