我怀疑异常可能会使 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/