Кварцевый планировщик не останавливается после выключения - PullRequest
8 голосов
/ 06 августа 2010

Я использую самый последний на данный момент кварц 1.8.3 на jboss 4.0.5.Кварцевые задания являются постоянными и сохраняются в локальной базе данных.Когда я вызываю метод shutdown или standby на выполняемых заданиях объекта кварцевого планировщика, он все еще продолжает выполняться планировщиком, только состояние заданий пустое и выполнение завершается неудачно.

Я ожидаю (по крайней мере, в соответствии с кварцем)Документация API), что при выключении или переводе планировщика в режим ожидания задания, ранее запланированные в базе данных, не будут выполняться.

Если вызов выключения или ожидания в планировщике не является способом достижения этого, что это?

Задания не только заканчивают выполнение, но и продолжают запускаться запланированные задания.

По запросу запрашивается дополнительная информация:

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);        
        }
    }
}

Ниже приведена копия свойств конфигурации кварца:

#============================================================================
# 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> 

Спасибо

Ответы [ 2 ]

7 голосов
/ 13 августа 2010

Если есть какие-либо задания, выполняемые при вызове 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, которое отключит кварцевый планировщик, как только ваш вызывающий поток закроется.Я не знаю, что происходит с состоянием рабочих мест.

Как уже упоминалось в комментариях, опубликуйте код и конфигурацию, чтобы получить четкий ответ.

3 голосов
/ 11 апреля 2011

вы можете использовать org.quartz.plugin.shutdownhook.cleanShutdown=TRUE в вашем файле свойств кварца

...