我怀疑异常可能会使TimerTask停止运行,在这种情况下,我很可能需要第二个timetask来监视第一个仍在运行?
更新资料
感谢您的回答。我继承了此代码,因此有点无知…
我刚刚看到,如果我在工作中抛出未捕获的异常,TimerThread将永远停止运行。
的运行方法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的提出,转向更好的调度。
当抛出未捕获的异常时,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; }