是否可以获得@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,但我无法分辨每个人的运行时间(这对我的代码很重要)。
答案 0 :(得分:1)
不幸的是,无法确定当前计时器回调的计划时间,只能使用Timer.getNextTimeout()来确定下一个计划时间。令我惊讶的是,getNextTimeout在你的例子中报告了10:36。我想知道这是不是一个缺陷?
答案 1 :(得分:0)
您可以从ScheduleExpression获取Timer。现在从这个表达式中,您可以获得日期/时间细节。
来自文档:
timer.getSchedule():获取与此对应的计划表达式 计时器。计时器必须是基于日历的计时器。它可能是 自动或以编程方式创建。