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

标签 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() ;
    }
}

最佳答案

因此,您希望这项工作每天早上 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/

相关文章:

java - 我的多维数组代码无法正常工作

java - 在 Robot Framework 中进行断言的最佳方法是什么?

java - Maven Build Plugin 不包含我自己的类

tomcat - 集群不起作用

java - 无法在 JSF 托管 bean 中使用 CDI 获取数据库连接

javascript - 没有 Java 应用程序上下文的 AJAX 调用

java - 找不到用于内省(introspection)工厂方法的类文件: java. util.concurrent.ThreadPoolExecutor.DiscardPolicy

tomcat 6 需要很长时间才能关机

java - org.apache.catalina.LifecycleException tomcat错误

apache - 无法登录到 Jenkins (解锁 Jenkins )