001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.routepolicy.quartz;
018
019 import java.util.Date;
020 import java.util.concurrent.TimeUnit;
021
022 import org.apache.camel.Route;
023 import org.apache.camel.component.quartz.QuartzComponent;
024 import org.apache.camel.util.ObjectHelper;
025 import org.quartz.SimpleTrigger;
026 import org.quartz.Trigger;
027 import org.slf4j.Logger;
028 import org.slf4j.LoggerFactory;
029
030 public class SimpleScheduledRoutePolicy extends ScheduledRoutePolicy {
031 private static final transient Logger LOG = LoggerFactory.getLogger(CronScheduledRoutePolicy.class);
032 private Date routeStartDate;
033 private int routeStartRepeatCount;
034 private long routeStartRepeatInterval;
035 private Date routeStopDate;
036 private int routeStopRepeatCount;
037 private long routeStopRepeatInterval;
038 private Date routeSuspendDate;
039 private int routeSuspendRepeatCount;
040 private long routeSuspendRepeatInterval;
041 private Date routeResumeDate;
042 private int routeResumeRepeatCount;
043 private long routeResumeRepeatInterval;
044
045 public void onInit(Route route) {
046 try {
047 doOnInit(route);
048 } catch (Exception e) {
049 throw ObjectHelper.wrapRuntimeCamelException(e);
050 }
051 }
052
053 protected void doOnInit(Route route) throws Exception {
054 QuartzComponent quartz = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class);
055 setScheduler(quartz.getScheduler());
056
057 // Important: do not start scheduler as QuartzComponent does that automatic
058 // when CamelContext has been fully initialized and started
059
060 if (getRouteStopGracePeriod() == 0) {
061 setRouteStopGracePeriod(10000);
062 }
063
064 if (getTimeUnit() == null) {
065 setTimeUnit(TimeUnit.MILLISECONDS);
066 }
067
068 // validate time options has been configured
069 if ((getRouteStartDate() == null) && (getRouteStopDate() == null) && (getRouteSuspendDate() == null) && (getRouteResumeDate() == null)) {
070 throw new IllegalArgumentException("Scheduled Route Policy for route {} has no stop/stop/suspend/resume times specified");
071 }
072
073 if (scheduledRouteDetails == null) {
074 scheduledRouteDetails = new ScheduledRouteDetails();
075 scheduledRouteDetails.setRoute(route);
076
077 if (getRouteStartDate() != null) {
078 scheduleRoute(Action.START);
079 }
080 if (getRouteStopDate() != null) {
081 scheduleRoute(Action.STOP);
082 }
083
084 if (getRouteSuspendDate() != null) {
085 scheduleRoute(Action.SUSPEND);
086 }
087 if (getRouteResumeDate() != null) {
088 scheduleRoute(Action.RESUME);
089 }
090 }
091 }
092
093 @Override
094 protected void doStop() throws Exception {
095 if (scheduledRouteDetails.getStartJobDetail() != null) {
096 deleteRouteJob(Action.START);
097 }
098 if (scheduledRouteDetails.getStopJobDetail() != null) {
099 deleteRouteJob(Action.STOP);
100 }
101 if (scheduledRouteDetails.getSuspendJobDetail() != null) {
102 deleteRouteJob(Action.SUSPEND);
103 }
104 if (scheduledRouteDetails.getResumeJobDetail() != null) {
105 deleteRouteJob(Action.RESUME);
106 }
107 }
108
109 @Override
110 protected Trigger createTrigger(Action action, Route route) throws Exception {
111 SimpleTrigger trigger = null;
112
113 if (action == Action.START) {
114 trigger = new SimpleTrigger(TRIGGER_START + route.getId(), TRIGGER_GROUP + route.getId(),
115 getRouteStartDate(), null, getRouteStartRepeatCount(), getRouteStartRepeatInterval());
116 } else if (action == Action.STOP) {
117 trigger = new SimpleTrigger(TRIGGER_STOP + route.getId(), TRIGGER_GROUP + route.getId(),
118 getRouteStopDate(), null, getRouteStopRepeatCount(), getRouteStopRepeatInterval());
119 } else if (action == Action.SUSPEND) {
120 trigger = new SimpleTrigger(TRIGGER_SUSPEND + route.getId(), TRIGGER_GROUP + route.getId(),
121 getRouteSuspendDate(), null, getRouteSuspendRepeatCount(), getRouteSuspendRepeatInterval());
122 } else if (action == Action.RESUME) {
123 trigger = new SimpleTrigger(TRIGGER_RESUME + route.getId(), TRIGGER_GROUP + route.getId(),
124 getRouteResumeDate(), null, getRouteResumeRepeatCount(), getRouteResumeRepeatInterval());
125 }
126
127 return trigger;
128 }
129
130 public Date getRouteStartDate() {
131 return routeStartDate;
132 }
133
134 public void setRouteStartDate(Date routeStartDate) {
135 this.routeStartDate = routeStartDate;
136 }
137
138 public Date getRouteStopDate() {
139 return routeStopDate;
140 }
141
142 public void setRouteStopDate(Date routeStopDate) {
143 this.routeStopDate = routeStopDate;
144 }
145
146 public Date getRouteSuspendDate() {
147 return routeSuspendDate;
148 }
149
150 public void setRouteSuspendDate(Date routeSuspendDate) {
151 this.routeSuspendDate = routeSuspendDate;
152 }
153
154 public int getRouteStartRepeatCount() {
155 return routeStartRepeatCount;
156 }
157
158 public void setRouteStartRepeatCount(int routeStartRepeatCount) {
159 this.routeStartRepeatCount = routeStartRepeatCount;
160 }
161
162 public long getRouteStartRepeatInterval() {
163 return routeStartRepeatInterval;
164 }
165
166 public void setRouteStartRepeatInterval(long routeStartRepeatInterval) {
167 this.routeStartRepeatInterval = routeStartRepeatInterval;
168 }
169
170 public int getRouteStopRepeatCount() {
171 return routeStopRepeatCount;
172 }
173
174 public void setRouteStopRepeatCount(int routeStopRepeatCount) {
175 this.routeStopRepeatCount = routeStopRepeatCount;
176 }
177
178 public long getRouteStopRepeatInterval() {
179 return routeStopRepeatInterval;
180 }
181
182 public void setRouteStopRepeatInterval(long routeStopRepeatInterval) {
183 this.routeStopRepeatInterval = routeStopRepeatInterval;
184 }
185
186 public int getRouteSuspendRepeatCount() {
187 return routeSuspendRepeatCount;
188 }
189
190 public void setRouteSuspendRepeatCount(int routeSuspendRepeatCount) {
191 this.routeSuspendRepeatCount = routeSuspendRepeatCount;
192 }
193
194 public long getRouteSuspendRepeatInterval() {
195 return routeSuspendRepeatInterval;
196 }
197
198 public void setRouteSuspendRepeatInterval(long routeSuspendRepeatInterval) {
199 this.routeSuspendRepeatInterval = routeSuspendRepeatInterval;
200 }
201
202 public void setRouteResumeDate(Date routeResumeDate) {
203 this.routeResumeDate = routeResumeDate;
204 }
205
206 public Date getRouteResumeDate() {
207 return routeResumeDate;
208 }
209
210 public void setRouteResumeRepeatCount(int routeResumeRepeatCount) {
211 this.routeResumeRepeatCount = routeResumeRepeatCount;
212 }
213
214 public int getRouteResumeRepeatCount() {
215 return routeResumeRepeatCount;
216 }
217
218 public void setRouteResumeRepeatInterval(long routeResumeRepeatInterval) {
219 this.routeResumeRepeatInterval = routeResumeRepeatInterval;
220 }
221
222 public long getRouteResumeRepeatInterval() {
223 return routeResumeRepeatInterval;
224 }
225
226 }