我怀疑异常会导致TimerTask停止运行,在这种情况下我很可能需要第二个时间任务来监视第一个仍在运行吗?
更新
感谢您的回答。我继承了这段代码,所以有点无知......
我刚看到如果我在工作中抛出未捕获的异常,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的说法改进调度。
答案 0 :(得分:2)
TimerTasks在抛出未捕获的异常时死亡(无论它是否在tomcat中运行都是无关的)。解决此问题的最简单方法是在run方法中捕获RuntimeException,并记录&继续,如果这是你想要的。
同样建议捕获Throwables并在重新抛出之前记录它,以便您可以在日志中看到堆栈跟踪,如下所示:
try{
doRun();
}catch (RuntimeException e){
logger.error("Uncaught Runtime Exception",e);
return; // Keep working
}catch (Throwable e){
logger.error("Unrecoverable error",e);
throw e;
}