Druid连接池源码解析(3)MBean是个啥

1 Mean是个啥

能看到Druid代码中定义了大量的MBean对象,如DruidAbstractDataSourceMBean等等,主要是用来管理和监控系统资源的,一般会包含如下信息:

  • 应用程序配置信息
  • 模块信息
  • 系统信息
  • 统计信息等
    MBean 也可以设立可读写的属性、直接操作某些函数甚至启动 MBean 可发送的 notification 等。
    可以在Jconsole等工具中方便地查看Mbean的信息

2 Druid中的Mbean

druid是自己实现的MBean的管理,在DataSource的init() 和close()中分别调用了registerMbean()和unregisterMbean()
注册时,调用了DruidDataSourceStatManager中的addDataSource()方法,

public synchronized static ObjectName addDataSource(Object dataSource, String name) {
        final Map instances = getInstances();

        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
        synchronized (instances) {
            if (instances.size() == 0) {
                try {
                    ObjectName objectName = new ObjectName(MBEAN_NAME);
                    if (!mbeanServer.isRegistered(objectName)) {
                        mbeanServer.registerMBean(instance, objectName);
                    }
                } catch (JMException ex) {
                    LOG.error("register mbean error", ex);
                }

                DruidStatService.registerMBean();
            }
        }

        ObjectName objectName = null;
        if (name != null) {
            try {
                objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + name);
                mbeanServer.registerMBean(dataSource, objectName);
            } catch (Throwable ex) {
                LOG.error("register mbean error", ex);
                objectName = null;
            }
        }

        if (objectName == null) {
            try {
                int id = System.identityHashCode(dataSource);
                objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + id);
                mbeanServer.registerMBean(dataSource, objectName);
            } catch (Throwable ex) {
                LOG.error("register mbean error", ex);
                objectName = null;
            }
        }

        instances.put(dataSource, objectName);
        return objectName;
    }

synchronized 锁是为了保证在注册DataSourceMbean先注册上DruidDataSourceStat的Mbean,还有DruidStatService的Mbean,之后注册当前DataSource的Mbean,在objectName的生成上运用了一些策略。

注册动作在每次init方法调用的时候都会执行,不用像JMX那样侵入式的创建了,这种方式在编写框架、基础组件时还是比较优雅的。之后工程中有简单的监控需求时,值得借鉴。


MBean的扩展阅读:
https://www.jianshu.com/p/6aff920def9b
https://www.liaoxuefeng.com/wiki/1252599548343744/1282385687609378
https://docs.oracle.com/javase/tutorial/jmx/mbeans/index.html

你可能感兴趣的:(Druid连接池源码解析(3)MBean是个啥)