使用quartz和struts框架时优雅地处理Tomcat关机

使用quartz和struts框架时优雅地处理Tomcat关机,tomcat,struts,quartz-scheduler,Tomcat,Struts,Quartz Scheduler,我正在使用struts和quartz框架来安排工作。它很好用 但是当我停止Tomcat(6.0.26)时,它会在控制台上抛出错误,如 “web应用程序似乎已启动名为[…]的线程,但未能停止该线程。这很可能导致内存泄漏 任何人都知道如何优雅地处理这件事 当前我的struts config.xml如下所示: 最好的确定方法是发送一个SIGQUIT(kill-3)程序并分析输出,以查看哪个线程仍在运行 很可能您的作业(在石英线程之一上运行)没有对关闭信号做出反应,并继续工作。如果长时间接受作业,您可以

我正在使用struts和quartz框架来安排工作。它很好用

但是当我停止Tomcat(6.0.26)时,它会在控制台上抛出错误,如

“web应用程序似乎已启动名为[…]的线程,但未能停止该线程。这很可能导致内存泄漏

任何人都知道如何优雅地处理这件事

当前我的struts config.xml如下所示:

最好的确定方法是发送一个SIGQUIT(kill-3)程序并分析输出,以查看哪个线程仍在运行


很可能您的作业(在石英线程之一上运行)没有对关闭信号做出反应,并继续工作。如果长时间接受作业,您可以检查
jobExecutionContext.getScheduler().isShutdown()
定期或将作业编程为可中断作业,并正确响应中断。

您需要调用scheduler.shutdown(true)命令Quartz等待任何正在进行的作业完成执行

另外,一些tomcat用户报告说,在关闭调用之后,他们还需要暂停线程一秒钟左右,以便在tomcat尝试检测线程是否保持运行之前,让其他线程的cpu时间进行清理


请参阅此处的讨论:

这是对jhouse答案的扩展。我不能将此代码放在注释中:-(

具体而言,您需要将ServletContextListener添加到web.xml:

<listener>
    <listener-class>org.whatever.MyListener</listener-class>
</listener>
我不需要调用scheduler shutdown方法(很明显,它们已经在某个地方被调用了,可能是因为我在使用Spring)。我所需要做的就是添加等待,然后它们都消失了(除了FileWatchdog Log4j线程和其他一些MySQL线程,但这些是不同的问题)

public class MyListener implements ServletContextListener {


    public void contextInitialized(ServletContextEvent arg0) {}

    /**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0) {
        try {
            // This can't use logging because it's (hopefully) been shut down by now.
            System.out.println("Sleep for a bit so that we don't get any errors about Quartz threads not being shut down yet. ");
            // For more info, see here: http://stackoverflow.com/questions/2730354/spring-scheduler-shutdown-error
            Thread.sleep(10 * 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}