java - TimerTask 在 Tomcat Servlet 中停止运行的原因可能是什么

标签 java tomcat servlets timertask

我怀疑异常可能会使 TimerTask 停止运行,在这种情况下,我很可能需要第二个时间任务来监视第一个时间任务是否仍在运行?

更新

感谢您的回答。我继承了这段代码所以有点无知......

我刚刚看到,如果我在我的工作中抛出一个未捕获的异常,TimerThread 将永远停止运行。

TimerThread 的 Run 方法表明,如果抛出异常,我安排的线程将不再运行。

public void run() {
    try {
        mainLoop();
    } finally {
        // Someone killed this Thread, behave as if Timer cancelled
        synchronized(queue) {
            newTasksMayBeScheduled = false;
            queue.clear();  // Eliminate obsolete references
        }
    }
}

堆栈跟踪的结尾将是:

at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)

因此,临时解决方案是捕捉一切...长期解决方案是转向更好的调度,如 BalusC 所述。

最佳答案

TimerTasks 在抛出未捕获的异常时终止(无论它是否在 tomcat 中运行都无关)。解决此问题的最简单方法是在 run 方法中捕获 RuntimeException,如果需要,记录并继续。

还建议在重新抛出之前捕获 Throwable 并记录它,这样您就可以在日志中看到堆栈跟踪,如下所示:

    try{
        doRun();
    }catch (RuntimeException e){
        logger.error("Uncaught Runtime Exception",e);
        return; // Keep working
    }catch (Throwable e){
        logger.error("Unrecoverable error",e);
        throw e;
    }

关于java - TimerTask 在 Tomcat Servlet 中停止运行的原因可能是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18965239/

相关文章:

java - is not abstract and does not override abstract method 错误

tomcat - 如何让更多登录tomcat

java - 如何将 primefaces 添加到我的 jsp 和 servlet 导航栏

java - 如何将数据放入 Google 应用引擎的数据存储区?

用于从文章中提取相关关键字/标签的java工具

java - PrimeFaces 4.0 selectOneMenu-ajax-call 适用于 GlassFish 4.0,但不适用于 Tomcat 7.0.27?

java - 使用Spring Boot时如何运行所有测试类但只启动一次嵌入式Tomcat?

Java Servlet -> 具有非静态属性的 Hashmap 中的静态图

java - JSONObject.toString : how NOT to escape slashes

java - 如何监视应用程序日志中的 java 堆内存不足错误?