001: /****************************************************************
002: * Licensed to the Apache Software Foundation (ASF) under one *
003: * or more contributor license agreements. See the NOTICE file *
004: * distributed with this work for additional information *
005: * regarding copyright ownership. The ASF licenses this file *
006: * to you under the Apache License, Version 2.0 (the *
007: * "License"); you may not use this file except in compliance *
008: * with the License. You may obtain a copy of the License at *
009: * *
010: * http://www.apache.org/licenses/LICENSE-2.0 *
011: * *
012: * Unless required by applicable law or agreed to in writing, *
013: * software distributed under the License is distributed on an *
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
015: * KIND, either express or implied. See the License for the *
016: * specific language governing permissions and limitations *
017: * under the License. *
018: ****************************************************************/package org.apache.james.util.watchdog;
019:
020: import org.apache.avalon.cornerstone.services.scheduler.PeriodicTimeTrigger;
021: import org.apache.avalon.cornerstone.services.scheduler.Target;
022: import org.apache.avalon.cornerstone.services.scheduler.TimeScheduler;
023:
024: /**
025: * This class is a factory to produce Watchdogs, each of which is associated
026: * with a single TimeScheduler Target and a TimeScheduler object.
027: *
028: * This could be used in James by adding a server configuration
029: * parameter:
030: *
031: * schedulerWatchdogs = conf.getChild("useSchedulerWatchdogs").getValueAsBoolean(false);
032: *
033: * getting the TimeScheduler component:
034: *
035: * scheduler = (TimeScheduler) compMgr.lookup(TimeScheduler.ROLE);
036: *
037: * and changing AbstractJamesService.getWatchdogFactory to look
038: * something like:
039: *
040: * protected WatchdogFactory getWatchdogFactory() {
041: * WatchdogFactory theWatchdogFactory = null;
042: * if (schedulerWatchdogs) {
043: * theWatchdogFactory = new SchedulerWatchdogFactory(scheduler, timeout);
044: * } else {
045: * theWatchdogFactory = new ThreadPerWatchdogFactory(threadPool, timeout);
046: * }
047: * if (theWatchdogFactory instanceof LogEnabled) {
048: * ((LogEnabled)theWatchdogFactory).enableLogging(getLogger());
049: * }
050: * return theWatchdogFactory;
051: * }
052: *
053: */
054: public class SchedulerWatchdogFactory implements WatchdogFactory {
055:
056: /**
057: * The thread pool used to generate InaccurateTimeoutWatchdogs
058: */
059: private TimeScheduler myTimeScheduler;
060:
061: private long timeout = -1;
062:
063: /**
064: * Creates the factory and sets the TimeScheduler used to implement
065: * the watchdogs.
066: *
067: * @param theTimeScheduler the scheduler that manages Watchdog triggering
068: * for Watchdogs produced by this factory
069: * @param timeout the timeout for Watchdogs produced by this factory
070: */
071: public SchedulerWatchdogFactory(TimeScheduler theTimeScheduler,
072: long timeout) {
073: this .timeout = timeout;
074: myTimeScheduler = theTimeScheduler;
075: }
076:
077: /**
078: * @see org.apache.james.util.watchdog.WatchdogFactory#getWatchdog(WatchdogTarget)
079: */
080: public Watchdog getWatchdog(WatchdogTarget theTarget) {
081: return new SchedulerWatchdog(theTarget);
082: }
083:
084: /**
085: * An inner class that acts as an adaptor between the Watchdog
086: * interface and the TimeScheduler interface.
087: */
088: private class SchedulerWatchdog implements Watchdog {
089:
090: /**
091: * The in-scheduler identifier for this trigger.
092: */
093: private String triggerID = null;
094:
095: /**
096: * The WatchdogTarget that is passed in when this
097: * SchedulerWatchdog is initialized
098: */
099: private WatchdogTarget theWatchdogTarget;
100:
101: /**
102: * Constructor for the SchedulerWatchdog
103: *
104: * @param theTarget the target triggered by this Watchdog
105: */
106: SchedulerWatchdog(WatchdogTarget theTarget) {
107: // TODO: This should be made more robust then just
108: // using toString()
109: triggerID = this .toString();
110: theWatchdogTarget = theTarget;
111: }
112:
113: /**
114: * Start this Watchdog, causing it to begin monitoring. The Watchdog can
115: * be stopped and restarted.
116: */
117: public void start() {
118: PeriodicTimeTrigger theTrigger = new PeriodicTimeTrigger(
119: (int) SchedulerWatchdogFactory.this .timeout, -1);
120: Target theTarget = new Target() {
121: public void targetTriggered(String targetID) {
122: theWatchdogTarget.execute();
123: }
124: };
125: SchedulerWatchdogFactory.this .myTimeScheduler.addTrigger(
126: triggerID, theTrigger, theTarget);
127: }
128:
129: /**
130: * Reset this Watchdog. Resets any conditions in the implementations
131: * (time to expiration, etc.) to their original values
132: */
133: public void reset() {
134: SchedulerWatchdogFactory.this .myTimeScheduler
135: .resetTrigger(triggerID);
136: }
137:
138: /**
139: * Stop this Watchdog, terminating the monitoring condition. The monitor
140: * can be restarted with a call to startWatchdog.
141: */
142: public void stop() {
143: SchedulerWatchdogFactory.this.myTimeScheduler
144: .removeTrigger(triggerID);
145: }
146: }
147:
148: }
|