JMX系列之JmxMBeanServer

咱們使用MBeanServer時候一般是下面這樣的使用方式:dom

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其實什麼活都沒幹,就是維護三個小弟幹活而已。
相關文章
相關標籤/搜索