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 для этих потоков?
Спасибо,
Томмазо
Ответы
Ответ 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();
}
}
}
}