Jmx标准Bean的使用方法

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确实比较方便,在没有配置中心的情况下,可以动态改变运行期程序的内部执行参数和行为,还能监控某些关键功能模块的执行情况,确实比较有用。

猜你喜欢

转载自www.cnblogs.com/weiguangyue/p/12297123.html