我将时间设置为 7:45,但每次重新启动我的 tomcat 时,无论时间如何,代码都会执行。 谁能建议我需要更改什么。
public void init() throws ServletException {
Calendar c = Calendar.getInstance();
Calendar currentDateTime = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,7);
c.set(Calendar.MINUTE, 45);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
System.out.println("current time = " + (currentDateTime.getTime()).toString());
System.out.println("************First run set @ " + c.getTime() +"******************");
timer.scheduleAtFixedRate(new Task(), c.getTime(), DAY);
}
class Task extends TimerTask {
public void run() {
doit() ;
}
}
最佳答案
因此,您希望这项工作每天早上 7:45 运行,但您没有跟踪该工作是否已经在“今天”运行。所以当你启动 Tomcat 时,你会得到一个新的日历,它说它是 2015-Jan-08 的下午 2:30,然后你将它更改为 2015-Jan-08 的 07:45AM,并告诉计时器在那个时间运行.
计时器说“哦,天哪,我迟到了!”并立即立即运行该任务,因为现在是下午 2:30,它应该在将近 7 小时前运行。正如 java.util.Timer.scheduleAtFixedRate
的文档所说,“如果预定的第一次是过去的时间,那么任何‘错过’的执行都将被安排为立即‘ catch ’执行。” (Timer 与之前 JVM 实例中可能存在的任何 Timer 没有任何联系,因此就此 Timer 而言,它今天尚未运行。)
那么,您的解决方案可能是检查现在几点;如果是在 7:45 之后,则在您的日历中添加一天,以便首次运行时间为 2015 年 1 月 -09 的早上 07:45。
更好的解决方案是在上次运行时间的某个地方更永久地记录下来,并相应地调整下一次运行时间(在 Tomcat 启动时)。这将考虑 Tomcat 在 07:40 崩溃并在 07:50 重新启动的场景。
Calendar c = Calendar.getInstance();
Date now = c.getTime();
c.set(Calendar.HOUR_OF_DAY, 7);
c.set(Calendar.MINUTE, 45);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Date taskTime = c.getTime();
if (taskTime.before(now)) {
c.add(Calendar.DATE, 1);
taskTime = c.getTime();
}
timer.scheduleAtFixedRate(new Task(), taskTime, DAY);
正如我上面所说,如果 Tomcat 恰好在 07:45 宕机,则当天任务将不会运行。如果你能忍受,那么这对你来说应该是完美的。否则,您将需要跟踪上次任务运行的时间并进行相应调整。
关于java - 无论 Java 中的计时器如何,Tomcat 的重新启动都会使作业每次都运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27846410/