Java石英内存泄漏消息

Java石英内存泄漏消息,java,tomcat,quartz-scheduler,Java,Tomcat,Quartz Scheduler,我的web应用程序中有一个quartz作业,由servlet启动。 当我重新部署我的应用程序时,我收到以下消息 [DefaultQuartzScheduler_Worker-5] but has failed to stop it. This is very likely to create a memory leak INFO: QuartzInitializer: Quartz Scheduler successful shutdown. 在生产中,我们还遇到了一个问题,即tomcat服

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

[DefaultQuartzScheduler_Worker-5] but has failed to stop it. This is very likely to create a memory leak
INFO: QuartzInitializer: Quartz Scheduler successful shutdown.
在生产中,我们还遇到了一个问题,即tomcat服务器在./shutdown.sh之后没有停止,因此我们必须终止进程。在我看来,这取决于石英的工作,这不能停止

如何通过重新部署应用程序或关闭服务器来停止quartz作业

我使用Tomcat7,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);

正如你所看到的,我的工作每天开始一次。我看不出有什么地方可以通过检查标志来取消作业。

如果正在关闭,您的作业必须定期检查(例如,在每次迭代中)。 这取决于你在工作中正确地实施这一点。石英和Tomcat在这方面都无能为力(他们应该如何停止线程?)

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

否则石英线程将在web应用程序的生命周期内生存!因此,web应用程序的更新不能保证作业被终止。我曾经有过僵尸工作“突然”醒来,就在一次新的部署之后。这是少数几个您不相信日志文件的情况之一


这就是为什么您必须杀死Tomcat的原因,因为有些正在运行的线程不是Tomcat创建的。

我的解决方案是更改配置。我创建了一个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>

我认为这个应该被问到(如果它是一个专业系统)或者。如果你在这里没有得到任何答案,请给我一个提示。调用很好。有趣的软件是工作本身。在作业中,您应该检查“正在关机”标志,然后作业应该终止。没有安全的方法从外部世界终止作业。如果您的作业计划、作业持续时间和关闭时间不冲突,则可以。你的工作需要多长时间?如果系统关闭,作业仍在运行(时间更长),会发生什么情况?
INFO: QuartzInitializer: Quartz Scheduler successful shutdown.