Quartz Scheduler 关闭后不停止

发布于 2024-09-13 00:13:40 字数 4406 浏览 4 评论 0原文

我在 jboss 4.0.5 上使用当前最新的quartz 1.8.3。 石英作业是持久的并保存到本地数据库中。 当我在执行的石英调度程序对象上调用 shutdown 或standby 方法时 作业仍然由调度程序继续执行,只是作业状态为空并且执行失败。

我希望(至少根据quartz API文档)当我关闭或使调度程序处于待机状态时,先前调度到数据库中的作业将不会被执行。

如果在调度程序上调用 shutdown 或standby 不是实现这一目标的方法,那么什么是呢?

作业不仅完成了执行,而且还继续触发了计划的作业。

以下是所询问的附加信息:

public class QuartzNotificationsSchedulerBean implements NotificationsScheduler, ServletContextAware {
...
public String scheduleNotification(Notification notification) {

        // Schedule the job with the trigger
        try {
            // Define job instance  

                String      groupName   = this.createNotificationGroupName(notification);
                String      triggerName = this.createNoficationTriggerName(notification);
                String      jobName     = this.createNoficationJobName(notification);
                JobDetail   job         = new JobDetail(jobName, groupName , ScheduledNotificationJob.class);

                JobDataMap jobDataMap = new JobDataMap();
                jobDataMap.putAll(notification.getContext());     
                job.setJobDataMap(jobDataMap);

                Calendar notificationTime = notification.getTime();    

                Trigger trigger = new SimpleTrigger(triggerName, groupName , notificationTime.getTime());

                scheduler.scheduleJob(job, trigger);        

                return trigger.getName();           
        } catch (SchedulerException e) {
            throw new NotificationScheduleException(e, notification);
        }

        return null;
    }

public void setServletContext(ServletContext servletContext) {      
        this.sf = (SchedulerFactory) servletContext.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);

        try {
            scheduler =  sf.getScheduler();
            if(scheduler.isStarted() == false) {
                scheduler.start();
            }

        } catch (SchedulerException e) {        
            logger.error("Failed to load Quartz scheduler ", e);        
        }
    }
}

以下是quartz配置属性的副本:

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = scheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.wrapJobExecutionInUserTransaction = true

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 45
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = FOR_QUARTZ
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000


#============================================================================
# Configure Datasources  
#============================================================================

org.quartz.dataSource.FOR_QUARTZ.jndiURL = java:jdbc/live-quartz

以下是来自web.xml的片段石英初始化的地方:

 <!--  START NOTIFICATION SERVICE -->
    <context-param>
        <param-name>config-file</param-name>
        <param-value>wm_quartz.properties</param-value>
    </context-param>
    <context-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>start-scheduler-on-load</param-name>
        <param-value>true</param-value>
    </context-param>    

    <listener>
        <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
    </listener> 

谢谢

I'm using the currently latest quartz 1.8.3 on jboss 4.0.5.
The quartz jobs are persistent and saved into a local database.
When I call the shutdown or standby method on the executing quartz scheduler object
jobs still continue to execute by the scheduler, only that the jobs state is empty and the execution fails.

I would expect (at least according to quartz API documentation) that when I shutdown or make the scheduler standby, that jobs previously scheduled into the database will not be executed.

If calling shutdown or standby on the scheduler is not the method to achieve that, what is?

The jobs are not just finishing the execution but planned jobs continue to be triggered.

Here is additional info as asked:

public class QuartzNotificationsSchedulerBean implements NotificationsScheduler, ServletContextAware {
...
public String scheduleNotification(Notification notification) {

        // Schedule the job with the trigger
        try {
            // Define job instance  

                String      groupName   = this.createNotificationGroupName(notification);
                String      triggerName = this.createNoficationTriggerName(notification);
                String      jobName     = this.createNoficationJobName(notification);
                JobDetail   job         = new JobDetail(jobName, groupName , ScheduledNotificationJob.class);

                JobDataMap jobDataMap = new JobDataMap();
                jobDataMap.putAll(notification.getContext());     
                job.setJobDataMap(jobDataMap);

                Calendar notificationTime = notification.getTime();    

                Trigger trigger = new SimpleTrigger(triggerName, groupName , notificationTime.getTime());

                scheduler.scheduleJob(job, trigger);        

                return trigger.getName();           
        } catch (SchedulerException e) {
            throw new NotificationScheduleException(e, notification);
        }

        return null;
    }

public void setServletContext(ServletContext servletContext) {      
        this.sf = (SchedulerFactory) servletContext.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);

        try {
            scheduler =  sf.getScheduler();
            if(scheduler.isStarted() == false) {
                scheduler.start();
            }

        } catch (SchedulerException e) {        
            logger.error("Failed to load Quartz scheduler ", e);        
        }
    }
}

The following is a copy of the quartz configuration properties:

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = scheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.wrapJobExecutionInUserTransaction = true

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 45
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = FOR_QUARTZ
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000


#============================================================================
# Configure Datasources  
#============================================================================

org.quartz.dataSource.FOR_QUARTZ.jndiURL = java:jdbc/live-quartz

Here is a snippet from the web.xml where the quartz is initialized:

 <!--  START NOTIFICATION SERVICE -->
    <context-param>
        <param-name>config-file</param-name>
        <param-value>wm_quartz.properties</param-value>
    </context-param>
    <context-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>start-scheduler-on-load</param-name>
        <param-value>true</param-value>
    </context-param>    

    <listener>
        <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
    </listener> 

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

百变从容 2024-09-20 00:13:40

如果调用 shutdown 时有作业正在执行,是否中断这些作业取决于属性 org.quartz.scheduler.interruptJobsOnShutdown 。

请参阅 http: //jira.terracotta.org/jira/browse/QTZ-41?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel 。我无法找到更多关于此的文档。

另一个属性是org.quartz.scheduler.makeSchedulerThreadDaemon=true,一旦调用线程关闭,它就会关闭quartz调度程序。我不知道工作状况会发生什么变化。

正如评论中提到的,发布一些代码和配置以获得明确的答案。

If there are any jobs executing when you call shutdown, whether to interrupt those jobs or not depends on the property org.quartz.scheduler.interruptJobsOnShutdown.

See http://jira.terracotta.org/jira/browse/QTZ-41?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel . I am unable to find more documentation on this.

The other property is org.quartz.scheduler.makeSchedulerThreadDaemon=true, which will shutdown quartz scheduler as soon as your calling thread shuts down. I do not know what happens to the state of the jobs.

As mentioned in the comments, post some code and configuration to get clear answer.

画尸师 2024-09-20 00:13:40

请尝试在初始化调度程序时应用这些配置。

org.quartz.threadPool.makeThreadsDaemons=true
org.quartz.scheduler.makeSchedulerThreadDaemon=true
org.quartz.scheduler.interruptJobsOnShutdown=true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

您可以参考此链接了解更多详细信息:https://www.techpaste.com/2016/03/quartz-scheduler-shutdown/

Please try to apply with these configuration when init scheduler

org.quartz.threadPool.makeThreadsDaemons=true
org.quartz.scheduler.makeSchedulerThreadDaemon=true
org.quartz.scheduler.interruptJobsOnShutdown=true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

You can refer to this link for more detail: https://www.techpaste.com/2016/03/quartz-scheduler-shutdown/

两个我 2024-09-20 00:13:40

你可以使用
org.quartz.plugin.shutdownhook.cleanShutdown=TRUE
在你的石英属性文件中

you can use
org.quartz.plugin.shutdownhook.cleanShutdown=TRUE
in your quartz properties file

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文