Java Quartz Memory泄漏消息

我的Web应用程序中有一个石英作业,由servlet启动。 当我重新部署我的应用程序时,我得到以下消息

[DefaultQuartzScheduler_Worker-5] but has failed to stop it. This is very likely to create a memory leak 

同样在生产中我们遇到的问题是tomcat-server在./shutdown.sh之后没有停止,因此我们必须终止进程。 在我看来,它依赖石英工作,不能停止。

如何通过重新部署我的应用程序或关闭服务器来停止石英作业?

我用tomcat 7,石英2.1.6 ……

  SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); scheduler.start(); JobDetail job = JobBuilder.newJob(XYZJob.class).withIdentity("job1", "group1").build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1") .startNow() .withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?")) .build(); scheduler.scheduleJob(job, trigger); 

你可以看到我的工作每天开始一次。 我没有看到我可以检查国旗,取消工作的一点。

我的解决方案是改变我的配置。 我创建了一个quartz.properties

 org.quartz.scheduler.instanceName = XYZJob org.quartz.threadPool.threadCount = 1 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml org.quartz.plugin.jobInitializer.failOnFileNotFound = true 

一个quartz-config.xml

     XYZJob XYZGroup Check the contracts idle period com.test.job.cron.XYZJob    CronTriggerName XYZJob XYZGroup  0 0 1 * * ?    

并在我的web.xml中使用QuartzInitializerServlet

  QuartzInitializer org.quartz.ee.servlet.QuartzInitializerServlet  config-file quartz.properties   shutdown-on-unload true   start-scheduler-on-load true  1  

关闭我的Tomcat后,我收到以下消息

 INFO: QuartzInitializer: Quartz Scheduler successful shutdown. 

如果正在关闭,您的工作必须定期检查(例如,在每次迭代中)。 您可以在工作中正确实施此function。 Quartz和Tomcat都不能在这里提供帮助(他们应该如何阻止线程?)。

您可以在ServletContextListener设置一个标志,方法contextDestroyed 。 如果设置了标志,则作业必须尽快完成。

石英线程在您的Web应用程序的生命周期中幸存! 因此,Web应用程序的更新并不能保证作业被终止。 在新的部署之后,我突然“突然”醒来了僵尸工作。 这是您不相信日志文件的少数情况之一。

这就是你必须kill Tomcat的原因,因为Tomcat还没有创建正在运行的线程。