对于我的webapp我使用Quartz。当我部署应用程序时,一切正常。当我取消部署应用程序时,Quartz线程不会被破坏。
记录是:
信息:停止服务Catalina
严重:网络应用程序 [/示例]似乎已经开始了 线程命名 [DefaultQuartzScheduler_Worker-1]但是 未能阻止它。这是非常的 可能会造成内存泄漏。七月 2010年12月6日下午6:30:40 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
任何人都可以告诉我如何强制执行这些线程的破坏操作?
谢谢,
托马索
答案 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可以通知应用程序启动和关机。
答案 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();
}
}
}
}