如何获取 EJB @Schedule 过期日期时间

How to get EJB @Schedule expired date time

是否可以获取@Schedule 过期的date/time?

如果 运行@Schedule 有延迟,那么实际过期时间是过去的时间。例如当服务器在关闭后重新启动时,永久计时器将 运行 错过 @Schedule。

我试过的示例作业。

import java.util.Date;

import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.Timer;

@Stateless
public class SimpleJob {
  @Schedule(hour="*", minute = "*/1", second = "0", persistent = true) // Every 1 minute
  public void schedule(Timer timer) {
    System.out.println("Now: " + new Date());
    System.out.println("\tTime remaining: "+ timer.getTimeRemaining());
    System.out.println("\tNext Timeout: "+timer.getNextTimeout());
    System.out.println("\tInfo: "+timer.getInfo());
  }
}

当我在关机后重新启动服务器时,我错过了 10:34:00 和 10:35:00 @Schedule

Now: Wed Feb 04 10:35:05 EST 2015
    Time remaining: 54235
    Next Timeout: Wed Feb 04 10:36:00 EST 2015
Now: Wed Feb 04 10:35:05 EST 2015
    Time remaining: 54233
    Next Timeout: Wed Feb 04 10:36:00 EST 2015
    Info: null

它正确地 运行 错过了 @Schedule,但我不知道每个人什么时候打算 运行(这对我的代码很重要)。

您可以获得ScheduleExpression from Timer。现在从这个表达式中,您可以获得 date/time 详细信息。

来自文档:

timer.getSchedule(): Get the schedule expression corresponding to this timer. The timer must be a calendar-based timer. It may have been created automatically or programmatically.

不幸的是,没有办法知道当前定时器回调被安排在什么时间,只能使用 Timer.getNextTimeout() 来确定下一个预定时间。令我惊讶的是,在您的示例中,getNextTimeout 正在为两者报告 10:36。我想知道这是否是缺陷?