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