我的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,quartz 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);
你可以看到我的工作每天开始一次。我没有看到我可以检查旗帜,取消工作的一点。
答案 0 :(得分:4)
我的解决方案是更改配置。我创建了一个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
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data
xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData
http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<schedule>
<job>
<name>XYZJob</name>
<group>XYZGroup</group>
<description>Check the contracts idle period</description>
<job-class>com.test.job.cron.XYZJob</job-class>
</job>
<trigger>
<cron>
<name>CronTriggerName</name>
<job-name>XYZJob</job-name>
<job-group>XYZGroup</job-group>
<!-- It will run every day at 1 am -->
<cron-expression>0 0 1 * * ?</cron-expression>
</cron>
</trigger>
</schedule>
并在我的web.xml中使用QuartzInitializerServlet
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name>config-file</param-name>
<param-value>quartz.properties</param-value>
</init-param>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
关闭我的Tomcat后,我收到以下消息
INFO: QuartzInitializer: Quartz Scheduler successful shutdown.
答案 1 :(得分:3)
如果正在关机,您的工作必须定期检查(例如,在每次迭代中)。 您可以在工作中正确实施此功能。 Quartz和Tomcat都不能在这里提供帮助(他们应该如何阻止线程?)。
您可以在ServletContextListener
方法contextDestroyed
中设置标记。
如果设置了标志,则作业必须尽快完成。
石英线程在您的Web应用程序的生命周期中幸存!因此,Web应用程序的更新并不能保证作业被终止。在新的部署之后,我已经“突然”醒来了僵尸工作。这是您不相信日志文件的少数情况之一。
这就是你必须kill
Tomcat的原因,因为Tomcat还没有创建正在运行的线程。