Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TimerTask停止在Tomcat Servlet中运行的原因是什么_Java_Tomcat_Servlets_Timertask - Fatal编程技术网

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

Java TimerTask停止在Tomcat Servlet中运行的原因是什么,java,tomcat,servlets,timertask,Java,Tomcat,Servlets,Timertask,我怀疑异常可能会使TimerTask停止运行,在这种情况下,我很可能需要第二个timetask来监视第一个timetask是否仍在运行 更新 谢谢你的回答。我继承了这个代码,所以有点无知 我只是看到,如果我在工作中抛出一个未预料到的异常,那么TimerThread将永远停止运行 TimerThread的Run方法显示,如果抛出异常,我的调度线程将不再运行 public void run() { try { mainLoop(); } finally {

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

更新

谢谢你的回答。我继承了这个代码,所以有点无知

我只是看到,如果我在工作中抛出一个未预料到的异常,那么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
        }
    }
}
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将永远停止运行。巴卢斯克的评论也恰到好处。