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 }