001    /*
002     * Apache License
003     * Version 2.0, January 2004
004     * http://www.apache.org/licenses/
005     *
006     * Copyright 2008-2010 by chenillekit.org
007     *
008     * Licensed under the Apache License, Version 2.0 (the "License");
009     * you may not use this file except in compliance with the License.
010     * You may obtain a copy of the License at
011     *
012     * http://www.apache.org/licenses/LICENSE-2.0
013     */
014    
015    package org.chenillekit.quartz.services.impl;
016    
017    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
018    import org.chenillekit.quartz.services.JobSchedulingBundle;
019    import org.chenillekit.quartz.services.QuartzSchedulerManager;
020    import org.quartz.CronTrigger;
021    import org.quartz.JobDetail;
022    import org.quartz.Scheduler;
023    import org.quartz.SchedulerException;
024    import org.quartz.SchedulerFactory;
025    import org.quartz.Trigger;
026    import org.slf4j.Logger;
027    
028    import java.util.Collection;
029    import java.util.List;
030    
031    /**
032     * manages the Quartz schedulers.
033     * <p/>
034     * adding all configured job scheduling bundles to the default or named scheduler.
035     *
036     * @version $Id: QuartzSchedulerManagerImpl.java 681 2010-08-02 08:50:10Z homburgs $
037     */
038    public class QuartzSchedulerManagerImpl implements QuartzSchedulerManager
039    {
040        private final SchedulerFactory schedulerFactory;
041        private final Logger logger;
042    
043        public QuartzSchedulerManagerImpl(Logger logger,
044                                          SchedulerFactory schedulerFactory,
045                                          Collection<JobSchedulingBundle> jobSchedulingBundles)
046        {
047            this.logger = logger;
048            this.schedulerFactory = schedulerFactory;
049    
050            try
051            {
052                for (JobSchedulingBundle jobSchedulingBundle : jobSchedulingBundles)
053                    addBundleToScheduler(jobSchedulingBundle);
054    
055                List<Scheduler> schedulers = CollectionFactory.newList(this.schedulerFactory.getAllSchedulers());
056                for (Scheduler scheduler : schedulers)
057                    scheduler.start();
058            }
059            catch (SchedulerException e)
060            {
061                throw new RuntimeException(e);
062            }
063        }
064    
065        /**
066         * get the default scheduler.
067         *
068         * @return the default scheduler
069         */
070        public Scheduler getScheduler()
071        {
072            return getScheduler(null);
073        }
074    
075        /**
076         * get a scheduler by its id.
077         * <p/>
078         * if <em>schedulerId</em> is null or length == 0, then return the default scheduler.
079         *
080         * @param schedulerId id of the scheduler
081         *
082         * @return a named scheduler
083         */
084        public Scheduler getScheduler(String schedulerId)
085        {
086            Scheduler scheduler;
087    
088            try
089            {
090                if (schedulerId == null || schedulerId.length() == 0)
091                    scheduler = schedulerFactory.getScheduler();
092                else
093                    scheduler = schedulerFactory.getScheduler(schedulerId);
094    
095                return scheduler;
096            }
097            catch (SchedulerException e)
098            {
099                throw new RuntimeException(e);
100            }
101        }
102    
103        /**
104         * shutdown all schedulers.
105         */
106        public void shutdown()
107        {
108            try
109            {
110                List<Scheduler> schedulers = CollectionFactory.newList(schedulerFactory.getAllSchedulers());
111                for (Scheduler scheduler : schedulers)
112                    shutdown(scheduler.getSchedulerName());
113            }
114            catch (SchedulerException e)
115            {
116                throw new RuntimeException(e);
117            }
118        }
119    
120        /**
121         * shutdown a scheduler by its id.
122         *
123         * @param schedulerId id of the scheduler
124         */
125        public void shutdown(String schedulerId)
126        {
127            try
128            {
129                Scheduler scheduler = schedulerFactory.getScheduler(schedulerId);
130                scheduler.shutdown();
131            }
132            catch (SchedulerException e)
133            {
134                throw new RuntimeException(e);
135            }
136        }
137    
138        /**
139         * adding a job detail/trigger bundle to the named or default scheduler.
140         *
141         * @param jobSchedulingBundle the job detail/trigger bundle
142         */
143        @SuppressWarnings({"JavaDoc"})
144        private void addBundleToScheduler(JobSchedulingBundle jobSchedulingBundle) throws SchedulerException
145        {
146            JobDetail jobDetail = jobSchedulingBundle.getJobDetail();
147            Trigger trigger = jobSchedulingBundle.getTrigger();
148            String schedulerId = jobSchedulingBundle.getSchedulerId();
149    
150            Scheduler scheduler = getScheduler(schedulerId);
151    
152            if (schedulerId == null || schedulerId.length() == 0)
153                schedulerId = "default";
154    
155            if (trigger != null)
156            {
157    
158                if (logger.isInfoEnabled())
159                {
160                    String triggerName = trigger.getName();
161                    if (trigger instanceof CronTrigger)
162                        triggerName += " (" + ((CronTrigger)trigger).getCronExpression() + ")";
163    
164                    logger.info("schedule job '{}' with trigger '{}' to scheduler '{}'",
165                                new Object[]{jobDetail.getName(), triggerName, schedulerId});
166                }
167    
168                scheduler.scheduleJob(jobDetail, trigger);
169            }
170            else
171            {
172                if (logger.isInfoEnabled())
173                    logger.info("add job '{}' to scheduler '{}'", jobDetail.getName(), schedulerId);
174    
175                scheduler.addJob(jobDetail, true);
176            }
177        }
178    }