1.1.德鲁伊当中的注册方法
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("com.alibaba.druid:type=DruidDataSourceStat"
);
if (!mbeanServer.isRegistered(objectName)) {
mbeanServer.registerMBean(instance, objectName);
}
1.2.德鲁伊当中的取消注册方法
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
try {
mbeanServer.unregisterMBean(new ObjectName("com.alibaba.druid:type=DruidDataSourceStat"));
} catch (JMException ex) {
LOG.error("unregister mbean error", ex);
}
1.3.德鲁伊当中的注册和取消注册的工具类
import java.lang.management.ManagementFactory;
import java.util.HashMap;
import java.util.Map;
import javax.management.InstanceAlreadyExistsException;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
/**
* @author wenshao [[email protected]]
*/
public final class JMXUtils {
public static ObjectName register(String name, Object mbean) {
try {
ObjectName objectName = new ObjectName(name);
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
try {
mbeanServer.registerMBean(mbean, objectName);
} catch (InstanceAlreadyExistsException ex) {
mbeanServer.unregisterMBean(objectName);
mbeanServer.registerMBean(mbean, objectName);
}
return objectName;
} catch (JMException e) {
throw new IllegalArgumentException(name, e);
}
}
public static void unregister(String name) {
try {
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
mbeanServer.unregisterMBean(new ObjectName(name));
} catch (JMException e) {
throw new IllegalArgumentException(name, e);
}
}
}
1.4.我自己写的工具
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class JmxBeanRegisterHelper {
private ObjectName getObjectName(Object target) {
String packageName = target.getClass().getPackage().getName();
String name = String.format("%s:type=%s_%s",packageName,target.getClass().getSimpleName(),System.hashCode(target));
try {
ObjectName objectName = new ObjectName(name);
return objectName;
} catch (Exception e) {
//ignore
}
return null;
}
public synchronized void unregisterMBean(Object target) {
try {
ObjectName objectName = this.getObjectName(target);
if(objectName != null) {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.unregisterMBean(objectName);
}
}catch (Exception e) {
//ignore
}
}
public synchronized void registerMBean(Object target) {
try {
ObjectName objectName = this.getObjectName(target);
if(objectName != null) {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
if(server.isRegistered(objectName)) {
server.unregisterMBean(objectName);
}
server.registerMBean(target,objectName);
}
}catch (Exception e) {
//ignore
}
}
}
Jmx确实比较方便,在没有配置中心的情况下,可以动态改变运行期程序的内部执行参数和行为,还能监控某些关键功能模块的执行情况,确实比较有用。