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.servicemix.components.varscheduler;
018:
019: import java.util.Date;
020: import java.util.Timer;
021: import java.util.TimerTask;
022:
023: /**
024: * Class to handle scheduling tasks.
025: * <p>
026: * This class is thread-safe
027: * <p>
028: *
029: * @author George Gastaldi (gastaldi)
030: */
031: public class Scheduler {
032:
033: private Timer timer;
034:
035: /**
036: * Creates a new Scheduler.
037: */
038: public Scheduler() {
039: this .timer = new Timer();
040: }
041:
042: /**
043: * Creates a new Daemon Scheduler
044: *
045: * @param daemon
046: * Thread must be executed as "daemon".
047: */
048: public Scheduler(boolean daemon) {
049: this .timer = new Timer(daemon);
050: }
051:
052: /**
053: * Cancels the scheduler task
054: */
055: public void cancel() {
056: timer.cancel();
057: }
058:
059: /**
060: * Schedules a task
061: *
062: * @param task
063: * scheduled tasl
064: * @param iterator
065: * iterator for schedulingque descreve o agendamento
066: * @throws IllegalStateException
067: * if task scheduled or canceled
068: */
069: public void schedule(SchedulerTask task, ScheduleIterator iterator) {
070: Date time = iterator.nextExecution();
071: if (time == null) {
072: task.cancel();
073: } else {
074: synchronized (task.lock) {
075: if (task.state != SchedulerTask.VIRGIN) {
076: throw new IllegalStateException(
077: "Task already scheduled or cancelled");
078: }
079: task.state = SchedulerTask.SCHEDULED;
080: task.timerTask = new SchedulerTimerTask(task, iterator);
081: timer.schedule(task.timerTask, time);
082: }
083: }
084: }
085:
086: private void reschedule(SchedulerTask task,
087: ScheduleIterator iterator) {
088: Date time = iterator.nextExecution();
089: if (time == null) {
090: task.cancel();
091: } else {
092: synchronized (task.lock) {
093: if (task.state != SchedulerTask.CANCELLED) {
094: task.timerTask = new SchedulerTimerTask(task,
095: iterator);
096: timer.schedule(task.timerTask, time);
097: }
098: }
099: }
100: }
101:
102: /**
103: * Internal TimerTask instance
104: */
105: class SchedulerTimerTask extends TimerTask {
106: private SchedulerTask task;
107:
108: private ScheduleIterator iterator;
109:
110: public SchedulerTimerTask(SchedulerTask task,
111: ScheduleIterator iterator) {
112: this .task = task;
113: this .iterator = iterator;
114: }
115:
116: public void run() {
117: task.run();
118: reschedule(task, iterator);
119: }
120: }
121:
122: }
|