1. 程式人生 > >JMX詳解詳細介紹及使用

JMX詳解詳細介紹及使用

JMX

1. JMX簡單介紹

JMX(Java Management Extensions)是一個為應用程式植入管理功能的框架。JMX是一套標準的代理和服務,
實際上,使用者可以在任何Java應用程式中使用這些代理和服務實現管理。主要用於對JAVA應用程式和JVM進行監控和管理。

JConsole和JVisualVM中能夠監控到JAVA應用程式和JVM的相關資訊都是通過JMX實現的。

JMX架構介紹

JMX架構圖

基礎監測層

監控層的作用就是使用MBean來監控我們關心的效能指標。因為我們通常關注的效能指標比較多,通常情況下,在監控層我們會有多個MBean,每個MBean監控一類資訊。

JMX代理

JMX代理是內嵌在Java應用程式中的,JMX代理相當於一個容器,所有的MBean都註冊到這個容器中,這個容器可以接受外部的請求,返回MBean的監控資訊。JMX Agent的核心元件是MBean server,它是一個管理物件的伺服器,MBeans在其中註冊。一個JMX代理還包括一組用於管理MBeans的服務和至少一個通訊介面卡(adaptor)或聯結器(connector) 以供管理程式訪問

遠端管理層

JMX 可以以多重方式來訪問JMX技術監測資訊,既可以通過現有的管理協議,比如簡單網路管理協議(SNMP),也可以通過專利性的協議。MBean server依賴協議介面卡(adaptors)和聯結器(connectors)來讓JMX代理供管理程式(位於JMX代理所在的JVM之外)訪問。
每個介面卡都通過一個特定的協議提供一個包含了所有註冊在MBean Server中的MBeans的檢視。比如,一個HTML介面卡可以在一個瀏覽器中顯示一個MBean。

2. MBean與MXBean的介紹

MBean介紹

MBean也是JavaBean的一種,在JMX中代表一種可以被管理的資源。一個MBean介面由屬性(可讀的,可能也是可寫的)和操作(可以由應用程式呼叫)組成。MBean可分為如下四種:

型別                  描述
standard MBean   這種型別的MBean最簡單,一個標準的MBean由一個MBean介面(該MBean介面列出了所有被暴露的屬性和操作對應的方法)
                 和一個class(這 個class實現了這個MBean介面並提供被監測資源的功能)組成(介面和class必須放在同一個包下,不然會出錯)。
                 它的命名也必須遵循一定的規範,例如我們的MBean為Hello,則介面必須為HelloMBean。標準MBean只能操作基本資料型別,
                 如 int、dubbo、lang等

dynamic MBean   必須實現javax.management.DynamicMBean介面,所有的屬性,方法都在執行時定義

open MBean      此MBean的規範還不完善,正在改進中

model MBean     與標準和動態MBean相比,你可以不用寫MBean類,只需使用javax.management.modelmbean.RequiredModelMBean即可。
                RequiredModelMBean實現了ModelMBean介面,而ModelMBean擴充套件了DynamicMBean介面,因此與DynamicMBean相似,
                Model MBean的管理資源也是在執行時定義的。與DynamicMBean不同的是,DynamicMBean管理的資源一般定義
                在DynamicMBean中(執行時才決定管理那些資源),而model MBean管理的資源並不在MBean中,而是在外部(通常是一個類),
                只有在執行時,才通過set方法將其加入到model MBean中。後面的例子會有詳細介紹
MXBean

MXBean是MBean的一種,MXBean與MBean一樣都需要定義一個介面和class類,但是MXBean並不要求Java類的名稱必須與介面名稱前部分相同。另外MXBean中還可以正常使用自定義資料型別;
如果在MBean中使用自定義資料型別的話,通過JConsole檢視時會顯示不可用。 當MXBean中使用被轉換成CompositeDataSupport類

標準MBean與MXBean的區別
  1. 在標準MBean中使用自定義資料型別時,JConsole中會顯示不可用;而在MXBean中可以正常所使用。
  2. 標準的MBean介面與Class的命名必須遵守是一定規範,而MXBean的介面與Class的命名沒有約束條件。

4. JMX的使用

標準MBean 使用規範

標準的MBean由一個MBean介面和一個Class類組成,並且介面必須命名為 xxxMBean 而 Class類名必須為 xxx 放與同一個包下,若不在同一包下執行時將出異常。

JMX的使用步驟
    1. 定義介面與資源實體類,介面中定義屬性與操作;get表示可讀,set表示可寫。
    2. 建立Agent類。
        a. 建立MBeanServer,相當於管理MBean的容器,建立方式有兩種一獲取JVM中預設啟動的Mbean server 或者 自己建立。
        b. 建立ObjectName,用於標識唯一的資源MBean,格式為:"域名:name=MBean名稱"。
        c. 繫結MBean與對應的ObjectName並註冊到MBeanServer。
    至此即可通過JConsole管理本地的MBean的先關資訊了,同事也可以提供其他的連線方式,如:
    3. rmi連線方式。
        a. 註冊監聽埠號。
        b. 建立JMXServiceURL,格式為:service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi(完整版)  JMXServiceURL格式說明 。
        c. 建立jmxConnectorServer,繫結MBserver與Url。
    4. HtmlAdaptor連線管理方式(需要引入jmxtools.jar)。
        a. 建立Html介面卡,並設定監聽埠。
        b. 建立介面卡ObjectName,繫結Html介面卡並註冊到MBeanServer。
        c. 開啟介面卡。

具體使用詳情,參考如下程式碼

    public static void init(LoggerContext loggerContext) throws Exception {
        mBeanServer = MBeanServerFactory.createMBeanServer(DOMAIN_NAME);
        // 註冊服務
        ObjectName objectName = new ObjectName(DOMAIN_NAME + ":name=" + RELOAD_CONFIG_NAME);
        jmxConfigurator = new JMXConfigurator(loggerContext, mBeanServer, objectName);
        mBeanServer.registerMBean(jmxConfigurator, objectName);

        // htmlAdaptor 註冊連線
        htmlAdaptorServer = new HtmlAdaptorServer();
        htmlAdaptorServer.setPort(HTML_PORT);
        objectName = new ObjectName(DOMAIN_NAME + ":name=" + CONNECTOR_NAME);
        mBeanServer.registerMBean(htmlAdaptorServer, objectName);
        htmlAdaptorServer.start();

        // rmi方式
        //這句話非常重要,不能缺少!註冊一個埠,繫結url後,客戶端就可以使用rmi通過url方式來連線JMXConnectorServer
        LocateRegistry.createRegistry(RMI_PORT);
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + RMI_PORT + "/logback_config");
        jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);
        jmxConnectorServer.start();
    }
JMXServiceURL格式說明
  • service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi
    藍色部分可以省略掉
  • service:jmx: 這個是JMX URL的標準字首,所有的JMX URL都必須以該字串開頭,否則會拋MalformedURLException
  • rmi: 這個是jmx connector server的傳輸協議,在這個url中是使用rmi來進行傳輸的
  • localhost:0 這個是jmx connector server的IP和埠,也就是真正提供服務的host和埠,可以忽略,那麼會在執行期間隨意繫結一個埠提供服務
  • jndi/rmi://localhost:1099/jmxrmi 這個是jmx connector server的路徑,具體含義取決於前面的傳輸協議。比如該URL中這串字串就代表著該jmx connector server的stub是使用 jndi api 繫結在 rmi://localhost:1099/jmxrmi 這個地址

JMX通知