001: /*
002: * MessageService: The message service daemon
003: * Copyright (C) 2007 Rift IT Contracting
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
018: *
019: * ProcessMonitor.java
020: */
021:
022: package com.rift.coad.daemon.messageservice;
023:
024: // logging import
025: import org.apache.log4j.Logger;
026:
027: /**
028: * The object responsible for monitoring the idle message processors.
029: *
030: * @author Brett Chaldecott
031: */
032: public class ProcessMonitor {
033:
034: // singleton
035: private static ProcessMonitor singleton = null;
036:
037: // the logger reference
038: protected Logger log = Logger.getLogger(ProcessMonitor.class
039: .getName());
040:
041: // private member variables
042: private boolean terminated = false;
043:
044: /**
045: * Creates a new instance of ProcessMonitor
046: */
047: private ProcessMonitor() {
048: }
049:
050: /**
051: * This method returns an instance of the process monitor.
052: *
053: * @return A reference to the process monitor singleton.
054: */
055: public static synchronized ProcessMonitor getInstance() {
056: if (singleton == null) {
057: singleton = new ProcessMonitor();
058: }
059: return singleton;
060: }
061:
062: /**
063: * This object will wait for the specified period of time before continuing.
064: *
065: * @param delay The length of time to delay processing.
066: */
067: public synchronized void monitor(long delay) {
068: try {
069: if (terminated) {
070: return;
071: }
072:
073: if (delay < 0) {
074: log.warn("Negative value of [" + delay
075: + "] supplied to monitor");
076: return;
077: } else if (delay == 0) {
078: wait();
079: } else {
080: wait(delay);
081: }
082: } catch (Exception ex) {
083: log.error("The monitor exited abnormally because : "
084: + ex.getMessage(), ex);
085: }
086: }
087:
088: /**
089: * This method notifies any waiting threads of the fact that they can
090: * continue processing.
091: */
092: public synchronized void notifyProcessor() {
093: notify();
094: }
095:
096: /**
097: * This method terminates this object so no threads will wait on it.
098: */
099: public synchronized void terminate() {
100: terminated = true;
101: notify();
102: }
103:
104: }
|