Tomcat 6 中的 Quartz 调度程序,线程不会停止

2022-09-04 22:03:03

对于我的网络应用程序,我使用Quartz。当我部署应用程序时,一切都没问题。当我取消部署应用程序时,Quartz 线程不会被破坏。

日志为:

信息: 停止服务卡塔利娜

严重:Web 应用程序 [/示例] 似乎启动了一个名为 [DefaultQuartzScheduler_Worker-1] 的线程,但未能停止它。这很可能会造成内存泄漏。Jul 12, 2010 6:30:40 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

任何人都可以告诉我如何强制执行这些线程的销毁操作?

谢谢

托马斯


答案 1

我发现对我来说问题是石英正在关闭,但web应用程序在关闭之前没有等待quartz完成,所以Tomcat决定它让线程运行并抱怨。

所以我像这样管理我的调度程序:

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

请注意,关机的布尔参数是至关重要的部分。如果您删除它以调用no-arg版本或将其设置为,则您的web应用程序不会等待quartz在关闭之前崩溃。truefalse

TL;DR:调用以使您的Web应用程序等待quartz完成。scheduler.shutdown(true)


答案 2

你是如何开始Quartz的?

假设您没有使用像Spring这样的方便的包装器,您可能希望在应用程序的Web.xml中使用a,以便Quartz可以收到应用程序启动关闭的通知。<listener>

例如,请参阅QuartzInitializerListenerQuartzInitializerServlet


推荐