for my webapp I use Quartz. When I deploy the app all is ok. When I undeploy the app, the Quartz thread is not destroyed.
Log is:
INFO: Stopping service Catalina
SEVERE: The web application [/example] appears to have started a thread named [DefaultQuartzScheduler_Worker-1] but has failed to stop it. This is very likely to create a memory leak. Jul 12, 2010 6:30:40 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Anyone can tell me how I can force the destroy action for those threads?
T开发者_如何学Chanks,
Tommaso
I found that the issue for me was that quartz was being shutdown but the webapp didn't wait for quartz to finish before it shutdown so Tomcat decided that it had left threads running and complained.
So I managed my scheduler like this:
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
...do some stuff with the scheduler...
scheduler.shutdown(true);
Note the boolean argument to shutdown is the vital part. If you remove that true
to call the no-arg version or set it to false
, your webapp won't wait for quartz to shudown before it shuts down.
TL;DR: call scheduler.shutdown(true)
to make your webapp wait for quartz to finish.
How are you starting Quartz?
Assuming you are not using a convenient wrapper like Spring, you probably want to be using a <listener>
in your application's web.xml so that Quartz can be notified of the application start and shutdown.
See QuartzInitializerListener or QuartzInitializerServlet for instance.
I recommend you to use the 2.x version and, add a listener to web.xml
.
Add the method below to the listener:
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();
}
}
}
}
精彩评论