无论java中的计时器如何,每次重启Tomcat都会使作业运行

时间:2015-01-08 17:48:48

标签: java tomcat

我将时间设置为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() ;
    }
}

2 个答案:

答案 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)

当日历传递您要使用的时区时,请确保系统使用您想要的时区。 这也使代码更加独立于系统。