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其实什么活都没干,就是维护三个小弟干活而已。