天天看點

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通知

Notification通知的使用