一尘不染

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

tomcat

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

更新资料

感谢您的回答。我继承了此代码,因此有点无知…

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

的运行方法TimerThread表明,如果引发异常,则计划的线程将永远不会再次运行。

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

stacktrace的结尾将是:

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

因此,临时解决方案是抓住一切…长期解决方案是,随着BalusC的提出,转向更好的调度。


阅读 416

收藏
2020-06-16

共1个答案

一尘不染

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

还建议也捕获Throwables并在重新抛出之前对其进行记录,以便可以在日志中看到stacktrace,如下所示:

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