我将时间设置为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() ;
}
}
答案 0 :(得分:1)
所以你希望这项工作每天早上7:45运行,但是你没有跟踪这份工作是否已经“今天”运行了。因此,当您启动Tomcat时,您将获得一个新的日历,它表示它是2015年1月8日下午2:30,然后您将其更改为2015年1月8日上午07:45,并告诉计时器当时运行
计时器说“哦,天啊,我迟到了!”并立即运行任务,因为它是下午2:30,它应该在大约7小时前运行。正如java.util.Timer.scheduleAtFixedRate
的文档所说,“如果计划的第一次是在过去,那么任何'错过的'执行都将被安排立即'追赶'执行。” (Timer与之前JVM实例中可能存在的任何Timers都没有连接,所以就这个Timer而言,它今天还没有运行。)
然后,您的解决方案可能是检查它的时间;如果是在7:45之后,那么在您的日历中添加一天,这样第一次运行时间是2015年1月7日上午07:45 09 。
更好的解决方案是在最后一次运行时注意某个更永久的地方,并相应地调整下一个运行时间(在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关闭,那么任务将不会在那天运行。如果你可以忍受,那么这对你来说应该是完美的。否则,您需要跟踪上次运行任务的时间并进行相应调整。
答案 1 :(得分:0)
当日历传递您要使用的时区时,请确保系统使用您想要的时区。 这也使代码更加独立于系统。