blob: 04380827ba47bea559f8c7d80048802c06dd761e [file] [log] [blame]
/*
* 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.servicemix.components.jmx;
import javax.jbi.JBIException;
import javax.jbi.component.ComponentContext;
import javax.jbi.management.DeploymentException;
import javax.jbi.messaging.InOnly;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
import javax.management.MBeanServer;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import javax.management.monitor.CounterMonitor;
import javax.xml.transform.Source;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.MessageExchangeListener;
import org.apache.servicemix.components.util.ComponentSupport;
import org.apache.servicemix.jbi.jaxp.StringSource;
/**
* A JMX Counter Monitor as a Component to enable firing notifications
*
* @version $Revision: 426415 $
*/
public class CounterMonitorComponent extends ComponentSupport implements NotificationListener, MessageExchangeListener {
private static final Log log = LogFactory.getLog(ComponentSupport.class);
private String name;
private ObjectName ourName;
private String observedObjectName;
private String attributeName;
private long granularityPeriod =5000;
private Number threshold;
private Number offset;
private MBeanServer mbeanServer;
private CounterMonitor counterMonitor = new CounterMonitor();
/**
* Called when the Component is initialized
*
* @param cc
* @throws JBIException
*/
public void init(ComponentContext cc) throws JBIException {
super.init(cc);
validate();
if (mbeanServer == null) {
mbeanServer = cc.getMBeanServer();
}
try {
ObjectName observedName = new ObjectName(observedObjectName);
if (name == null) {
String type = observedName.getKeyProperty("type");
type = type != null ? type : "UNKNOWN";
name = mbeanServer.getDefaultDomain() + ":type=CounterMonitor_" + type;
}
ourName = new ObjectName(name);
counterMonitor.setNotify(true);
counterMonitor.addObservedObject(observedName);
counterMonitor.setObservedAttribute(attributeName);
counterMonitor.setGranularityPeriod(granularityPeriod);
counterMonitor.setDifferenceMode(false);
counterMonitor.setInitThreshold(threshold);
counterMonitor.setOffset(offset);
mbeanServer.registerMBean(counterMonitor, ourName);
mbeanServer.addNotificationListener(ourName, this, null, new Object());
} catch (Exception e) {
throw new DeploymentException(e);
}
}
/**
* Start the item.
*
* @exception javax.jbi.JBIException
* if the item fails to start.
*/
public void start() throws javax.jbi.JBIException {
super.start();
counterMonitor.start();
}
/**
* Stop the item. This suspends current messaging activities.
*
* @exception javax.jbi.JBIException
* if the item fails to stop.
*/
public void stop() throws javax.jbi.JBIException {
counterMonitor.stop();
super.stop();
}
/**
* Shut down the item. The releases resources, preparatory to uninstallation.
*
* @exception javax.jbi.JBIException
* if the item fails to shut down.
*/
public void shutDown() throws javax.jbi.JBIException {
stop();
if (ourName != null && mbeanServer != null) {
try{
mbeanServer.removeNotificationListener(ourName,this);
} catch(Exception e) {
throw new JBIException(e);
}
}
super.shutDown();
}
/**
* @see javax.management.NotificationListener#handleNotification(javax.management.Notification, java.lang.Object)
*/
public void handleNotification(Notification notification,Object arg1) {
try {
Source source = new StringSource(notification.getMessage());
InOnly exchange = getExchangeFactory().createInOnlyExchange();
NormalizedMessage message = exchange.createMessage();
message.setContent(source);
exchange.setInMessage(message);
send(exchange);
}
catch (Exception e) {
log.error("Failed to send Notification message to the NMR");
}
}
protected void validate() throws JBIException {
if (observedObjectName == null) {
throw new DeploymentException("observedObjectName is null");
}
if (attributeName == null) {
throw new DeploymentException("attributeName is null");
}
if (threshold == null) {
throw new DeploymentException("threshold is null");
}
if (offset == null) {
throw new DeploymentException("offset is null");
}
}
/**
* @return Returns the attributeName.
*/
public String getAttributeName() {
return attributeName;
}
/**
* @param attributeName
* The attributeName to set.
*/
public void setAttributeName(String attributeName) {
this.attributeName = attributeName;
}
/**
* @return Returns the counterMonitor.
*/
public CounterMonitor getCounterMonitor() {
return counterMonitor;
}
/**
* @param counterMonitor The counterMonitor to set.
*/
public void setCounterMonitor(CounterMonitor counterMonitor) {
this.counterMonitor = counterMonitor;
}
/**
* @return Returns the granularityPeriod.
*/
public long getGranularityPeriod() {
return granularityPeriod;
}
/**
* @param granularityPeriod The granularityPeriod to set.
*/
public void setGranularityPeriod(long granularityPeriod) {
this.granularityPeriod = granularityPeriod;
}
/**
* @return Returns the mbeanServer.
*/
public MBeanServer getMbeanServer() {
return mbeanServer;
}
/**
* @param mbeanServer The mbeanServer to set.
*/
public void setMbeanServer(MBeanServer mbeanServer) {
this.mbeanServer = mbeanServer;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the observedObjectName.
*/
public String getObservedObjectName() {
return observedObjectName;
}
/**
* @param observedObjectName The observedObjectName to set.
*/
public void setObservedObjectName(String observedObjectName) {
this.observedObjectName = observedObjectName;
}
/**
* @return Returns the offset.
*/
public Number getOffset() {
return offset;
}
/**
* @param offset The offset to set.
*/
public void setOffset(Number offset) {
this.offset = offset;
}
/**
* @return Returns the threshold.
*/
public Number getThreshold() {
return threshold;
}
/**
* @param threshold The threshold to set.
*/
public void setThreshold(Number threshold) {
this.threshold = threshold;
}
public void onMessageExchange(MessageExchange exchange) throws MessagingException {
// We can only receive acks, so do nothing
}
}