Tomcat 6中的Quartz调度程序,线程不会停止

时间:2010-07-12 16:37:48

标签: java tomcat6 quartz-scheduler

对于我的webapp我使用Quartz。当我部署应用程序时,一切正常。当我取消部署应用程序时,Quartz线程不会被破坏。

记录是:

  

信息:停止服务Catalina

     

严重:网络应用程序   [/示例]似乎已经开始了   线程命名   [DefaultQuartzScheduler_Worker-1]但是   未能阻止它。这是非常的   可能会造成内存泄漏。七月   2010年12月6日下午6:30:40   org.apache.catalina.loader.WebappClassLoader   clearReferencesThreads

任何人都可以告诉我如何强制执行这些线程的破坏操作?

谢谢,

托马索

3 个答案:

答案 0 :(得分:6)

我发现对我来说问题是石英正在关闭但是webapp并没有等到石英完成它才关闭所以Tomcat决定它已经让线程运行并抱怨。

所以我像这样管理我的调度程序:

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
...do some stuff with the scheduler...
scheduler.shutdown(true);

注意shutdown的布尔参数是重要部分。如果您删除true以调用no-arg版本或将其设置为false,那么您的webapp将不会等待石英在关闭之前甩掉。

TL; DR:致电scheduler.shutdown(true)让你的webapp等待石英完成。

答案 1 :(得分:4)

你是如何开始使用Quartz的?

假设您没有使用像Spring这样的方便包装器,您可能希望在应用程序的web.xml中使用<listener>,以便Quartz可以通知应用程序启动关机。

例如,请参阅QuartzInitializerListenerQuartzInitializerServlet

答案 2 :(得分:0)

我建议您使用2.x版本,并向web.xml添加一个监听器。

将以下方法添加到侦听器:

public void contextDestroyed(ServletContextEvent event) {

    if (this.contextLoader != null && event!=null && event
        .getServletContext()!=null) {
        ServletContext context = event.getServletContext();
        StdSchedulerFactory sch = (StdSchedulerFactory) context.getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");

        if(sch!=null){
            try {
                logger.debug("call quartz Scheduler.shutdown()");
                Collection<Scheduler> col = sch.getAllSchedulers();
                for(Scheduler s:col){ 
                    s.shutdown();
                }
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    }
}