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

时间:2015-02-03 23:40:18

标签: java-ee ejb ejb-3.1

是否可以获得@Schedule过期的日期/时间?

如果运行@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,但我无法分辨每个人的运行时间(这对我的代码很重要)。

2 个答案:

答案 0 :(得分:1)

不幸的是,无法确定当前计时器回调的计划时间,只能使用Timer.getNextTimeout()来确定下一个计划时间。令我惊讶的是,getNextTimeout在你的例子中报告了10:36。我想知道这是不是一个缺陷?

答案 1 :(得分:0)

您可以从ScheduleExpression获取Timer。现在从这个表达式中,您可以获得日期/时间细节。

来自文档:

  

timer.getSchedule():获取与此对应的计划表达式   计时器。计时器必须是基于日历的计时器。它可能是   自动或以编程方式创建。