001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.monitor.services;
023:
024: import java.util.Date;
025:
026: import javax.management.InstanceNotFoundException;
027: import javax.management.MBeanServerInvocationHandler;
028: import javax.management.ObjectName;
029: import javax.management.timer.TimerMBean;
030:
031: import org.jboss.system.ServiceMBeanSupport;
032: import org.jboss.util.Strings;
033:
034: /**
035: * A simple service used to configure the periodic emition of notifications
036: * by a standard JMX Timer.
037: *
038: * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
039: * @version $Revision: 57210 $
040: */
041: public class TimerService extends ServiceMBeanSupport implements
042: TimerServiceMBean {
043: // Private Data --------------------------------------------------
044:
045: /** Notification type */
046: private String notificationType;
047:
048: /** Notification message */
049: private String notificationMessage;
050:
051: /** Timer period string */
052: private String timerPeriodString;
053:
054: /** Number of occurences */
055: private long repeatitions;
056:
057: /** Periodic execution mode */
058: private boolean fixedRate;
059:
060: /** TimerMBean name */
061: private ObjectName timerObjectName;
062:
063: /** Timer period as long */
064: private long timerPeriod;
065:
066: /** Proxy to the TimerMBean */
067: private TimerMBean timerProxy;
068:
069: /** The timer subscription id */
070: private Integer id;
071:
072: // Constructors --------------------------------------------------
073:
074: /**
075: * CTOR
076: */
077: public TimerService() {
078: // empty
079: }
080:
081: // Attributes -----------------------------------------------------
082:
083: /**
084: * @jmx:managed-attribute
085: */
086: public void setNotificationType(String type) {
087: this .notificationType = type;
088: }
089:
090: /**
091: * @jmx:managed-attribute
092: */
093: public String getNotificationType() {
094: return notificationType;
095: }
096:
097: /**
098: * @jmx:managed-attribute
099: */
100: public void setNotificationMessage(String message) {
101: this .notificationMessage = message;
102: }
103:
104: /**
105: * @jmx:managed-attribute
106: */
107: public String getNotificationMessage() {
108: return notificationMessage;
109: }
110:
111: /**
112: * @jmx:managed-attribute
113: */
114: public void setTimerPeriod(String timerPeriod) {
115: this .timerPeriod = Strings.parsePositiveTimePeriod(timerPeriod);
116: this .timerPeriodString = timerPeriod;
117: }
118:
119: /**
120: * @jmx:managed-attribute
121: */
122: public String getTimerPeriod() {
123: return this .timerPeriodString;
124: }
125:
126: /**
127: * @jmx:managed-attribute
128: */
129: public void setRepeatitions(long repeatitions) {
130: this .repeatitions = repeatitions;
131: }
132:
133: /**
134: * @jmx:managed-attribute
135: */
136: public long getRepeatitions() {
137: return repeatitions;
138: }
139:
140: /**
141: * @jmx:managed-attribute
142: */
143: public void setFixedRate(boolean fixedRate) {
144: this .fixedRate = fixedRate;
145: }
146:
147: /**
148: * @jmx:managed-attribute
149: */
150: public boolean getFixedRate() {
151: return fixedRate;
152: }
153:
154: /**
155: * @jmx:managed-attribute
156: */
157: public void setTimerMBean(ObjectName timerMBean) {
158: this .timerProxy = (TimerMBean) MBeanServerInvocationHandler
159: .newProxyInstance(getServer(), timerMBean,
160: TimerMBean.class, false);
161: this .timerObjectName = timerMBean;
162: }
163:
164: /**
165: * @jmx:managed-attribute
166: */
167: public ObjectName getTimerMBean() {
168: return timerObjectName;
169: }
170:
171: // Lifecycle control (ServiceMBeanSupport) -----------------------
172:
173: /**
174: * Start
175: */
176: public void startService() throws Exception {
177: if (timerProxy != null) {
178: id = timerProxy.addNotification(notificationType,
179: notificationMessage, null, // UserData
180: new Date(), // now
181: timerPeriod, repeatitions, fixedRate);
182:
183: log.debug("Added timer notification(" + id + ") : type="
184: + notificationType + ", message="
185: + notificationMessage + ", period="
186: + timerPeriodString + ", repeatitions="
187: + repeatitions + ", fixedRate=" + fixedRate
188: + ", to timer '" + timerObjectName + "'");
189: } else {
190: log.warn("TimerMBean not set");
191: }
192: }
193:
194: /**
195: * Stop
196: */
197: public void stopService() {
198: if (id != null) {
199: try {
200: timerProxy.removeNotification(id);
201: log.debug("Removed timer notification(" + id
202: + ") from timer '" + timerObjectName + "'");
203: } catch (InstanceNotFoundException ignore) {
204: // after a fixed number of repeatitions
205: // the notification is removed from the timer
206: }
207: id = null;
208: }
209: }
210:
211: }
|