Java TimerTask停止在Tomcat Servlet中运行的原因是什么
我怀疑异常可能会使TimerTask停止运行,在这种情况下,我很可能需要第二个timetask来监视第一个timetask是否仍在运行 更新 谢谢你的回答。我继承了这个代码,所以有点无知 我只是看到,如果我在工作中抛出一个未预料到的异常,那么TimerThread将永远停止运行Java TimerTask停止在Tomcat Servlet中运行的原因是什么,java,tomcat,servlets,timertask,Java,Tomcat,Servlets,Timertask,我怀疑异常可能会使TimerTask停止运行,在这种情况下,我很可能需要第二个timetask来监视第一个timetask是否仍在运行 更新 谢谢你的回答。我继承了这个代码,所以有点无知 我只是看到,如果我在工作中抛出一个未预料到的异常,那么TimerThread将永远停止运行 TimerThread的Run方法显示,如果抛出异常,我的调度线程将不再运行 public void run() { try { mainLoop(); } finally {
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
}
}
}
stacktrace的结尾将是:
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
所以临时解决方案就是抓住一切。。。长期的解决方案是按照BalusC的说法,转向更好的调度。当抛出一个未捕获的异常时,TimerTasks就会消失(无论它是否在tomcat中运行都是无关的)。解决此问题的最简单方法是在run方法中捕获RuntimeException,如果需要,则记录并继续 还建议您在重播之前捕获一次性文件并记录它,以便您可以在日志中看到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;
}
... 第三个是确保看门狗仍在运行。因此是第三方调度库。我不太理解您的问题,但如果您想创建调度任务,请参考此项,不要在假定的生命周期长的Java EE应用程序中使用
Timer
!另请参见下面的答案:谢谢。。。我只是看到,如果我在工作中抛出一个未预料到的异常,那么TimerThread将永远停止运行。巴卢斯克的评论也恰到好处。