/** * 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.quartz2; import java.util.Date; import java.util.concurrent.TimeUnit; import org.apache.camel.Route; import org.apache.camel.component.quartz2.QuartzComponent; import org.apache.camel.util.ObjectHelper; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.TriggerBuilder; public class SimpleScheduledRoutePolicy extends ScheduledRoutePolicy { private Date routeStartDate; private int routeStartRepeatCount; private long routeStartRepeatInterval; private Date routeStopDate; private int routeStopRepeatCount; private long routeStopRepeatInterval; private Date routeSuspendDate; private int routeSuspendRepeatCount; private long routeSuspendRepeatInterval; private Date routeResumeDate; private int routeResumeRepeatCount; private long routeResumeRepeatInterval; 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("quartz2", 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 ((getRouteStartDate() == null) && (getRouteStopDate() == null) && (getRouteSuspendDate() == null) && (getRouteResumeDate() == null)) { throw new IllegalArgumentException("Scheduled Route Policy for route {} has no start/stop/suspend/resume times specified"); } registerRouteToScheduledRouteDetails(route); if (getRouteStartDate() != null) { scheduleRoute(Action.START, route); } if (getRouteStopDate() != null) { scheduleRoute(Action.STOP, route); } if (getRouteSuspendDate() != null) { scheduleRoute(Action.SUSPEND, route); } if (getRouteResumeDate() != null) { scheduleRoute(Action.RESUME, route); } } @Override protected Trigger createTrigger(Action action, Route route) throws Exception { SimpleTrigger trigger = null; if (action == Action.START) { trigger = TriggerBuilder.newTrigger() .withIdentity(TRIGGER_START + route.getId(), TRIGGER_GROUP + route.getId()) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(getRouteStartRepeatCount()) .withIntervalInMilliseconds(getRouteStartRepeatInterval())) .startAt(routeStartDate == null ? new Date() : routeStartDate) .build(); } else if (action == Action.STOP) { trigger = TriggerBuilder.newTrigger() .withIdentity(TRIGGER_STOP + route.getId(), TRIGGER_GROUP + route.getId()) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(getRouteStopRepeatCount()) .withIntervalInMilliseconds(getRouteStopRepeatInterval())) .startAt(routeStopDate == null ? new Date() : routeStopDate) .build(); } else if (action == Action.SUSPEND) { trigger = TriggerBuilder.newTrigger() .withIdentity(TRIGGER_SUSPEND + route.getId(), TRIGGER_GROUP + route.getId()) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(getRouteSuspendRepeatCount()) .withIntervalInMilliseconds(getRouteSuspendRepeatInterval())) .startAt(routeSuspendDate == null ? new Date() : routeSuspendDate) .build(); } else if (action == Action.RESUME) { trigger = TriggerBuilder.newTrigger() .withIdentity(TRIGGER_RESUME + route.getId(), TRIGGER_GROUP + route.getId()) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withRepeatCount(getRouteResumeRepeatCount()) .withIntervalInMilliseconds(getRouteResumeRepeatInterval())) .startAt(routeResumeDate == null ? new Date() : routeResumeDate) .build(); } return trigger; } public Date getRouteStartDate() { return routeStartDate; } public void setRouteStartDate(Date routeStartDate) { this.routeStartDate = routeStartDate; } public Date getRouteStopDate() { return routeStopDate; } public void setRouteStopDate(Date routeStopDate) { this.routeStopDate = routeStopDate; } public Date getRouteSuspendDate() { return routeSuspendDate; } public void setRouteSuspendDate(Date routeSuspendDate) { this.routeSuspendDate = routeSuspendDate; } public int getRouteStartRepeatCount() { return routeStartRepeatCount; } public void setRouteStartRepeatCount(int routeStartRepeatCount) { this.routeStartRepeatCount = routeStartRepeatCount; } public long getRouteStartRepeatInterval() { return routeStartRepeatInterval; } public void setRouteStartRepeatInterval(long routeStartRepeatInterval) { this.routeStartRepeatInterval = routeStartRepeatInterval; } public int getRouteStopRepeatCount() { return routeStopRepeatCount; } public void setRouteStopRepeatCount(int routeStopRepeatCount) { this.routeStopRepeatCount = routeStopRepeatCount; } public long getRouteStopRepeatInterval() { return routeStopRepeatInterval; } public void setRouteStopRepeatInterval(long routeStopRepeatInterval) { this.routeStopRepeatInterval = routeStopRepeatInterval; } public int getRouteSuspendRepeatCount() { return routeSuspendRepeatCount; } public void setRouteSuspendRepeatCount(int routeSuspendRepeatCount) { this.routeSuspendRepeatCount = routeSuspendRepeatCount; } public long getRouteSuspendRepeatInterval() { return routeSuspendRepeatInterval; } public void setRouteSuspendRepeatInterval(long routeSuspendRepeatInterval) { this.routeSuspendRepeatInterval = routeSuspendRepeatInterval; } public void setRouteResumeDate(Date routeResumeDate) { this.routeResumeDate = routeResumeDate; } public Date getRouteResumeDate() { return routeResumeDate; } public void setRouteResumeRepeatCount(int routeResumeRepeatCount) { this.routeResumeRepeatCount = routeResumeRepeatCount; } public int getRouteResumeRepeatCount() { return routeResumeRepeatCount; } public void setRouteResumeRepeatInterval(long routeResumeRepeatInterval) { this.routeResumeRepeatInterval = routeResumeRepeatInterval; } public long getRouteResumeRepeatInterval() { return routeResumeRepeatInterval; } }