JMX系列之JmxMBeanServer

我们使用MBeanServer时候通常是下面这样的使用方式:

MBeanServer server = MBeanServerFactory.createMBeanServer("domain");

最近利用台风“温比亚”路过大连的时候,研究了一下MBeanServer到底是什么鬼?
首先看我整理的UML的类图;

从下往上看
MBeanServerFactory维护了一个MBeanServerBuilder类型的builder,
MBeanServerFactory的createMBeanServer方法调用自己的newMBeanServer方法,然后调用builder的newMBeanServer方法,

而builder的newMBeanServer直接关联的是JmxMBeanServer.newMBeanServer()方法,此方法内部创建自己的对象,并对维护的三个成员变量赋值操作;

JmxMBeanServer的三个成员变量(图中我只画出了拦截器的关系):

  ① MBeanInstantiator instantiator 实例化工具
    主要负责MBean的实例化
    维护了clr = new ClassLoaderRepositorySupport()的对象,通过clr来管理MBean的类加载器
  ② MBeanServerDelegate mBeanServerDelegateObject 用来监控自己的MBean
  ③ MBeanServer mbsInterceptor 的拦截器
    拦截器→顾名思义我们从上图可以看到JmxMBeanServer和mbsInterceptor都是实现了MBeanServer的接口,mbsInterceptor又是JmxMBeanServer的依赖,
    这样的设计作用是什么呢?源代码我们可以看出,JmxMBeanServer的ObjectInstance createMBean方法,是直接委托mbsInterceptor的ObjectInstance createMBean去工作的。
    mbsInterceptor引用对应的默认实现类:DefaultMBeanServerInterceptor维护了一个Repository类型repository,
    repository算是至关重要的了他维护了一个存放MBean的Map:
      Map<String,Map<String,NamedObject>> domainTb:
        外层Map的key是域,默认是字符串类型的"domain",通常是被初始化的。里层的Map的key是MBean的name,value当然是我们注册的MBean对象了。
从源代码可以看出JmxMBeanServer其实什么活都没干,就是维护三个小弟干活而已。

posted on 2018-08-20 15:56  剑姬  阅读(3973)  评论(0编辑  收藏  举报

导航