JMX系列之JmxMBeanServer

Posted saber-himesama

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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其实什么活都没干,就是维护三个小弟干活而已。





















以上是关于JMX系列之JmxMBeanServer的主要内容,如果未能解决你的问题,请参考以下文章

java之JMX

195 - JMX的组态和服务URL

195 - JMX的组态和服务URL

195 - JMX的组态和服务URL

Zabbix3.2.6之通过JMX监控Tomcat

Java 监控基础 - 使用 JMX 监控和管理 Java 程序