package org.red5.server.jmx;
/*
* RED5 Open Source Flash Server - http://www.osflash.org/red5
*
* Copyright (c) 2006-2009 by respective authors (see below). All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any later
* version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.StandardMBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Provides access to the MBeanServer as well as registration
* and creation of new MBean instances. For most classes the creation
* and registration is performed using StandardMBean wrappers.
* <br />
* References:
* http://www.onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html?page=1
* http://java.sun.com/developer/JDCTechTips/2005/tt0315.html#2
* <br />
* Examples:
* http://java.sun.com/javase/6/docs/technotes/guides/jmx/examples.html
* <br />
*
* @author The Red5 Project (red5@osflash.org)
* @author Paul Gregoire (mondain@gmail.com)
*/
public class JMXFactory {
private static String domain = "org.red5.server";
private static Logger log = LoggerFactory.getLogger(JMXFactory.class);
private static MBeanServer mbs;
static {
// try the first mbean server before grabbing platform, this should
// make things easier when using jboss or tomcats built in jmx.
try {
mbs = (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
} catch (Exception e) {
// grab a reference to the "platform" MBeanServer
mbs = ManagementFactory.getPlatformMBeanServer();
}
}
public static ObjectName createMBean(String className, String attributes) {
log.info("Create the {} MBean within the MBeanServer", className);
ObjectName objectName = null;
try {
StringBuilder objectNameStr = new StringBuilder(domain);
objectNameStr.append(":type=");
objectNameStr.append(className
.substring(className.lastIndexOf(".") + 1));
objectNameStr.append(",");
objectNameStr.append(attributes);
log.info("ObjectName = {}", objectNameStr);
objectName = new ObjectName(objectNameStr.toString());
if (!mbs.isRegistered(objectName)) {
mbs.createMBean(className, objectName);
} else {
log.debug("MBean has already been created: {}", objectName);
}
} catch (Exception e) {
log.error("Could not create the {} MBean. {}", className, e);
}
return objectName;
}
public static ObjectName createObjectName(String... strings) {
ObjectName objName = null;
StringBuilder sb = new StringBuilder(domain);
sb.append(':');
for (int i = 0, j = 1; i < strings.length; i += 2, j += 2) {
//log.debug("------------" + strings[i] + " " + strings[j]);
//sb.append(ObjectName.quote(strings[i]));
sb.append(strings[i]);
sb.append('=');
//sb.append(ObjectName.quote(strings[j]));
sb.append(strings[j]);
sb.append(',');
}
sb.deleteCharAt(sb.length() - 1);
try {
log.info("Object name: {}", sb.toString());
objName = new ObjectName(sb.toString());
} catch (Exception e) {
log.warn("Exception creating object name", e);
}
return objName;
}
public static ObjectName createSimpleMBean(String className,
String objectNameStr) {
log.info("Create the {} MBean within the MBeanServer", className);
log.info("ObjectName = {}", objectNameStr);
try {
ObjectName objectName = ObjectName.getInstance(objectNameStr);
if (!mbs.isRegistered(objectName)) {
mbs.createMBean(className, objectName);
} else {
log.debug("MBean has already been created: {}", objectName);
}
return objectName;
} catch (Exception e) {
log.error("Could not create the {} MBean. {}", className, e);
}
return null;
}
public static String getDefaultDomain() {
return domain;
}
public static MBeanServer getMBeanServer() {
return mbs;
}
@SuppressWarnings("unchecked")
public static boolean registerNewMBean(String className,
Class interfaceClass) {
boolean status = false;
try {
String cName = className;
if (cName.indexOf('.') != -1) {
cName = cName.substring(cName.lastIndexOf('.')).replaceFirst(
"[\\.]", "");
}
log.debug("Register name: " + cName);
mbs.registerMBean(new StandardMBean(Class.forName(className)
.newInstance(), interfaceClass), new ObjectName(domain
+ ":type=" + cName));
status = true;
} catch (Exception e) {
log.error("Could not register the " + className + " MBean", e);
}
return status;
}
@SuppressWarnings("unchecked")
public static boolean registerNewMBean(String className,
Class interfaceClass, ObjectName name) {
boolean status = false;
try {
String cName = className;
if (cName.indexOf('.') != -1) {
cName = cName.substring(cName.lastIndexOf('.')).replaceFirst(
"[\\.]", "");
}
log.debug("Register name: " + cName);
mbs.registerMBean(new StandardMBean(Class.forName(className)
.newInstance(), interfaceClass), name);
status = true;
} catch (Exception e) {
log.error("Could not register the " + className + " MBean", e);
}
return status;
}
@SuppressWarnings("unchecked")
public static boolean registerNewMBean(String className,
Class interfaceClass, String name) {
boolean status = false;
try {
String cName = className;
if (cName.indexOf('.') != -1) {
cName = cName.substring(cName.lastIndexOf('.')).replaceFirst(
"[\\.]", "");
}
log.debug("Register name: " + cName);
mbs.registerMBean(new StandardMBean(Class.forName(className)
.newInstance(), interfaceClass), new ObjectName(domain
+ ":type=" + cName + ",name=" + name));
status = true;
} catch (Exception e) {
log.error("Could not register the " + className + " MBean", e);
}
return status;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
JMXFactory.domain = domain;
}
}