/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.routepolicy.quartz; import java.util.TimeZone; import java.util.concurrent.TimeUnit; import org.apache.camel.Route; import org.apache.camel.component.quartz.QuartzComponent; import org.apache.camel.util.ObjectHelper; import org.quartz.CronTrigger; import org.quartz.Trigger; public class CronScheduledRoutePolicy extends ScheduledRoutePolicy implements ScheduledRoutePolicyConstants { private String routeStartTime; private String routeStopTime; private String routeSuspendTime; private String routeResumeTime; private String timeZoneString; private TimeZone timeZone; public void onInit(Route route) { try { doOnInit(route); } catch (Exception e) { throw ObjectHelper.wrapRuntimeCamelException(e); } } protected void doOnInit(Route route) throws Exception { QuartzComponent quartz = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class); setScheduler(quartz.getScheduler()); // Important: do not start scheduler as QuartzComponent does that automatic // when CamelContext has been fully initialized and started if (getRouteStopGracePeriod() == 0) { setRouteStopGracePeriod(10000); } if (getTimeUnit() == null) { setTimeUnit(TimeUnit.MILLISECONDS); } // validate time options has been configured if ((getRouteStartTime() == null) && (getRouteStopTime() == null) && (getRouteSuspendTime() == null) && (getRouteResumeTime() == null)) { throw new IllegalArgumentException("Scheduled Route Policy for route {} has no start/stop/suspend/resume times specified"); } registerRouteToScheduledRouteDetails(route); if (getRouteStartTime() != null) { scheduleRoute(Action.START, route); } if (getRouteStopTime() != null) { scheduleRoute(Action.STOP, route); } if (getRouteSuspendTime() != null) { scheduleRoute(Action.SUSPEND, route); } if (getRouteResumeTime() != null) { scheduleRoute(Action.RESUME, route); } } @Override protected Trigger createTrigger(Action action, Route route) throws Exception { CronTrigger trigger = null; if (action == Action.START) { trigger = new CronTrigger(TRIGGER_START + route.getId(), TRIGGER_GROUP + route.getId(), getRouteStartTime()); } else if (action == Action.STOP) { trigger = new CronTrigger(TRIGGER_STOP + route.getId(), TRIGGER_GROUP + route.getId(), getRouteStopTime()); } else if (action == Action.SUSPEND) { trigger = new CronTrigger(TRIGGER_SUSPEND + route.getId(), TRIGGER_GROUP + route.getId(), getRouteSuspendTime()); } else if (action == Action.RESUME) { trigger = new CronTrigger(TRIGGER_RESUME + route.getId(), TRIGGER_GROUP + route.getId(), getRouteResumeTime()); } // Just reset the time zone once the timeZone parameter is set if (timeZone != null) { trigger.setTimeZone(timeZone); } return trigger; } public void setRouteStartTime(String routeStartTime) { this.routeStartTime = routeStartTime; } public String getRouteStartTime() { return routeStartTime; } public void setRouteStopTime(String routeStopTime) { this.routeStopTime = routeStopTime; } public String getRouteStopTime() { return routeStopTime; } public void setRouteSuspendTime(String routeSuspendTime) { this.routeSuspendTime = routeSuspendTime; } public String getRouteSuspendTime() { return routeSuspendTime; } public void setRouteResumeTime(String routeResumeTime) { this.routeResumeTime = routeResumeTime; } public String getRouteResumeTime() { return routeResumeTime; } public String getTimeZone() { return timeZoneString; } public void setTimeZone(String timeZone) { this.timeZoneString = timeZone; this.timeZone = TimeZone.getTimeZone(timeZone); } }