Кварцевый планировщик в Tomcat 6, поток не останавливается - PullRequest
13 голосов
/ 12 июля 2010

для моего веб-приложения я использую Quartz. Когда я развертываю приложение, все в порядке. Когда я удаляю приложение, Кварцевая нить не уничтожается.

Журнал:

ИНФОРМАЦИЯ : Остановка службы Catalina

SEVERE : веб-приложение [/ пример], кажется, начал названная нить [DefaultQuartzScheduler_Worker-1], но не смог остановить это. Это очень скорее всего, создать утечку памяти. июль 12, 2010 18:30:40 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

Кто-нибудь может сказать мне, как я могу заставить действие уничтожения для этих потоков?

Спасибо

Томмазо

Ответы [ 3 ]

6 голосов
/ 24 января 2013

Я обнаружил, что проблема для меня заключается в том, что кварц отключается, но веб-приложение не дожидается его завершения до завершения работы, поэтому Tomcat решил, что он оставил работающие потоки, и пожаловался.

Итак, я управлял своим планировщиком так:

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

Обратите внимание, что логический аргумент shutdown является жизненно важной частью . Если вы удалите этот true, чтобы вызвать версию без аргументов, или установите его на false, ваше веб-приложение не будет ждать, пока кварц исчезнет, ​​прежде чем оно выключится.

TL; DR: позвоните scheduler.shutdown(true), чтобы заставить ваше веб-приложение ждать завершения кварца.

4 голосов
/ 12 июля 2010

Как вы начинаете Quartz?

Предполагая, что вы не используете удобную оболочку, такую ​​как Spring, вы, вероятно, захотите использовать <listener> в файле web.xml вашего приложения, чтобы Quartz мог получать уведомления о запуске приложения и .

См., Например, QuartzInitializerListener или QuartzInitializerServlet .

0 голосов
/ 03 июля 2012

Я рекомендую вам использовать версию 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();
            }
        }
    }
}
...