001: /*
002: * ChainBuilder ESB
003: * Visual Enterprise Integration
004: *
005: * Copyright (C) 2007 Bostech Corporation
006: *
007: * This program is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License as published by the
009: * Free Software Foundation; either version 2 of the License, or (at your option)
010: * any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
014: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
015: * for more details.
016: *
017: * You should have received a copy of the GNU General Public License along with
018: * this program; if not, write to the Free Software Foundation, Inc.,
019: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: *
022: * $Id: SchedulerCore.java 6993 2007-04-23 19:12:18Z mpreston $
023: */
024: package com.bostechcorp.cbesb.runtime.scheduler;
025:
026: import java.util.Calendar;
027: import java.util.Date;
028: import java.util.HashMap;
029:
030: import org.apache.commons.logging.Log;
031: import org.apache.commons.logging.LogFactory;
032: import org.quartz.CronTrigger;
033: import org.quartz.JobDetail;
034: import org.quartz.Scheduler;
035: import org.quartz.SchedulerException;
036: import org.quartz.SchedulerFactory;
037: import org.quartz.SimpleTrigger;
038: import org.quartz.Trigger;
039: import org.quartz.impl.StdSchedulerFactory;
040:
041: public class SchedulerCore {
042:
043: private Log log = LogFactory.getLog(SchedulerCore.class);
044:
045: private SchedulerFactory schedulerFactory;
046: private Scheduler scheduler;
047: private ARInitialTriggerListener triggerListenerInitial;
048: private ARRetryTriggerListener triggerListenerRetry;
049:
050: private HashMap<String, JobInfo> jobMap;
051:
052: public SchedulerCore() {
053: try {
054: schedulerFactory = new StdSchedulerFactory();
055: scheduler = schedulerFactory.getScheduler();
056: triggerListenerInitial = new ARInitialTriggerListener();
057: scheduler.addTriggerListener(triggerListenerInitial);
058: triggerListenerRetry = new ARRetryTriggerListener();
059: scheduler.addTriggerListener(triggerListenerRetry);
060: jobMap = new HashMap<String, JobInfo>();
061: } catch (SchedulerException e) {
062: log.error("Exception caught while initializing scheduler",
063: e);
064: }
065: }
066:
067: public void start() {
068: try {
069: log.debug("Starting scheduler");
070: scheduler.start();
071: } catch (SchedulerException e) {
072: log.error("Exception caught while starting scheduler", e);
073: }
074: }
075:
076: public void shutdown() {
077: try {
078: log.debug("Stopping scheduler");
079: scheduler.shutdown();
080: } catch (SchedulerException e) {
081: log.error("Exception caught while stopping scheduler", e);
082: }
083: }
084:
085: private JobInfo getJobInfo(String jobName, String jobGroup) {
086: String key = jobGroup + "." + jobName;
087: if (!jobMap.containsKey(key)) {
088: JobInfo jobInfo = new JobInfo(jobName, jobGroup);
089: jobMap.put(key, jobInfo);
090: return jobInfo;
091: } else {
092: return jobMap.get(key);
093: }
094: }
095:
096: public void submitStandardJob(String jobName, String jobGroup,
097: IStandardJobProcessor jobProcessor,
098: StandardSchedule schedule) throws Exception {
099: log.debug("SchedulerCore - submitting standard job " + jobGroup
100: + "." + jobName);
101: JobInfo jobInfo = getJobInfo(jobName, jobGroup);
102: int index = jobInfo.getJobDetailList().size();
103:
104: JobDetail jobDetail = new JobDetail(jobName + "_dtl" + index,
105: jobGroup, StandardJob.class);
106: jobDetail.getJobDataMap().put("JobProcessor", jobProcessor);
107: jobInfo.getJobDetailList().add(jobDetail);
108:
109: CronTrigger trigger = new CronTrigger();
110: trigger.setCronExpression(schedule.getCronExpression());
111: trigger.setName(jobName + "_tgr" + index);
112: trigger.setGroup(jobGroup);
113:
114: if (schedule.getHolidaySchedule() != null) {
115: trigger.setCalendarName(schedule.getHolidaySchedule());
116: }
117:
118: jobInfo.getTriggerList().add(trigger);
119:
120: scheduler.scheduleJob(jobDetail, trigger);
121: }
122:
123: public void submitAutoRetryJob(String jobName, String jobGroup,
124: IAutoRetryJobProcessor jobProcessor,
125: AutoRetrySchedule schedule) throws Exception {
126: log.debug("SchedulerCore - submitting auto-retry job "
127: + jobGroup + "." + jobName);
128: JobInfo jobInfo = getJobInfo(jobName, jobGroup);
129: int index = jobInfo.getJobDetailList().size();
130:
131: JobDetail jobDetail = new JobDetail(jobName + "_dtl" + index,
132: jobGroup, AutoRetryJob.class);
133: jobDetail.getJobDataMap().put(
134: AutoRetryConstants.SCHEDULER_CORE_INSTANCE, this );
135: jobDetail.getJobDataMap().put(AutoRetryConstants.JOB_PROCESSOR,
136: jobProcessor);
137: jobDetail.getJobDataMap().put(AutoRetryConstants.END_TIME,
138: schedule.getEndTime());
139: jobDetail.getJobDataMap().put(
140: AutoRetryConstants.RETRY_INTERVAL,
141: schedule.getRetryInterval());
142: jobInfo.getJobDetailList().add(jobDetail);
143:
144: CronTrigger trigger = new CronTrigger();
145: trigger.setCronExpression(schedule.getCronExpression());
146: trigger.setName(jobName + "_tgr" + index);
147: trigger.setGroup(jobGroup);
148:
149: if (schedule.getHolidaySchedule() != null) {
150: trigger.setCalendarName(schedule.getHolidaySchedule());
151: }
152:
153: trigger.addTriggerListener("ARInitialTriggerListener");
154: jobInfo.getTriggerList().add(trigger);
155:
156: scheduler.scheduleJob(jobDetail, trigger);
157: }
158:
159: public void scheduleRetryTrigger(JobDetail jobDetail,
160: int retryInterval, String endTime) throws Exception {
161: log.debug("SchedulerCore - rescheduling job - end time = "
162: + endTime + " retry interval = " + retryInterval);
163: SimpleTrigger trigger = new SimpleTrigger(jobDetail.getName()
164: + "_retry", jobDetail.getGroup());
165: log.debug(trigger.getFullJobName());
166: //Set the start time to now + retry interval
167: //so we don't retry immediately
168: Date startTime = new Date((new Date()).getTime()
169: + (retryInterval * 1000L));
170: trigger.setStartTime(startTime);
171: trigger.setRepeatInterval(retryInterval * 1000L);
172: trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
173:
174: //Set the End Time
175: Calendar startCal = Calendar.getInstance();
176: startCal.setTime(startTime);
177: Calendar endCal = Calendar.getInstance();
178: endCal.setTime(startTime);
179: if (endTime == null) {
180: throw new Exception("End Time is null.");
181: }
182: String[] endTimeArray = endTime.split(":");
183: if (endTimeArray.length != 3) {
184: throw new Exception("End Time is not valid: " + endTime);
185: }
186: int hour = Integer.parseInt(endTimeArray[0]);
187: int minute = Integer.parseInt(endTimeArray[1]);
188: int second = Integer.parseInt(endTimeArray[2]);
189: endCal.set(Calendar.HOUR_OF_DAY, hour);
190: endCal.set(Calendar.MINUTE, minute);
191: endCal.set(Calendar.SECOND, second);
192: if (endCal.before(startCal)) {
193: //End time is before start time,
194: //assume the end time is the next day
195: endCal.add(Calendar.DATE, 1);
196: }
197: trigger.setEndTime(endCal.getTime());
198:
199: trigger.addTriggerListener("ARRetryTriggerListener");
200: trigger.setJobName(jobDetail.getName());
201: trigger.setJobGroup(jobDetail.getGroup());
202: scheduler.scheduleJob(trigger);
203: }
204:
205: public void unScheduleRetryTrigger(Trigger trigger)
206: throws Exception {
207: scheduler.unscheduleJob(trigger.getName(), trigger.getGroup());
208: }
209:
210: public void removeJob(String jobName, String jobGroup)
211: throws Exception {
212: log.debug("SchedulerCore - Removing Job " + jobGroup + "."
213: + jobName);
214: JobInfo jobInfo = getJobInfo(jobName, jobGroup);
215: for (int i = 0; i < jobInfo.getJobDetailList().size(); i++) {
216: JobDetail jobDetail = jobInfo.getJobDetailList().elementAt(
217: i);
218: scheduler.deleteJob(jobDetail.getName(), jobDetail
219: .getGroup());
220: }
221: }
222:
223: public void submitHolidaySchedule(String name,
224: HolidaySchedule holidaySchedule) throws Exception {
225: scheduler.addCalendar(name, holidaySchedule
226: .toQuartzHolidayCalendar(), true, true);
227: }
228:
229: public void removeHolidaySchedule(String name) throws Exception {
230: scheduler.deleteCalendar(name);
231: }
232:
233: }
|