Jakarta ee Java EE 7:Get@Schedule date when设置为persistent=true

Jakarta ee Java EE 7:Get@Schedule date when设置为persistent=true,jakarta-ee,schedule,Jakarta Ee,Schedule,在我的JavaEE7应用程序中,我创建了一个每小时运行一次的持久调度任务。我使用了@Schedule注释 调用此作业时,我希望对从上个小时到现在发生的事件执行一些操作。为了获得现在,我使用“newdate()” 此@Schedule的默认持久属性为“true”,这很好,因为如果服务器在数小时内停止,我希望在服务器重新启动时执行这些任务 问题是,如果服务器在5小时内停止,作业将启动5次,但在所有执行中都将执行“new Date()”,并且结果相同 有什么方法可以检索@Schedule作业应该启动的

在我的JavaEE7应用程序中,我创建了一个每小时运行一次的持久调度任务。我使用了@Schedule注释

调用此作业时,我希望对从上个小时到现在发生的事件执行一些操作。为了获得现在,我使用“newdate()”

此@Schedule的默认持久属性为“true”,这很好,因为如果服务器在数小时内停止,我希望在服务器重新启动时执行这些任务

问题是,如果服务器在5小时内停止,作业将启动5次,但在所有执行中都将执行“new Date()”,并且结果相同


有什么方法可以检索@Schedule作业应该启动的日期吗?

您可以使用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();
}
有没有办法检索@Schedule作业应该启动的日期

我想答案是不,没有

定义了容器必须实现的三个接口。 这些接口是:、和。 如您所见,它们中没有一个(特别是计时器)公开该方法 你需要的。因此,兼容JavaEE的服务器不会被迫实现这种行为

也许您应该自己实现一个提供此需求的解决方案。 例如,您可以在上次回调方法时存储时间戳 已执行,并使用此时间戳确定时间段(而不是将当前日期减去1小时)

…如果服务器在5小时内停止,则作业将启动5次

请注意,您不能依赖于此

18.4.3计时器过期和超时回调方法 …在干预期间过期的任何间隔永久计时器或基于时间表的永久计时器 时间必须使相应的超时回调方法在重新启动时至少调用一次


我想象直接使用TimerService可以以某种方式实现这一点,但我想使用@Schedule注释的方法。当使用持久计时器时,此方法不起作用,因为当服务器关闭并重新启动时,在JBoss中,它将以相同的下一个超时值运行所有错过的计时器。