Подтвердить что ты не робот

Quartz scheduler в Tomcat 6, нить не останавливается

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

Журнал:

INFO: остановка сервиса Catalina

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

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

Спасибо,

Томмазо

4b9b3361

Ответ 1

Как вы начинаете кварц?

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

См. QuartzInitializerListener или QuartzInitializerServlet например.

Ответ 2

Я обнаружил, что проблема для меня заключалась в том, что кварц закрывался, но 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 дождался завершения кварца.

Ответ 3

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