JMX
1. JMX簡單介紹
JMX(Java Management Extensions)是一個為應用程式植入管理功能的架構。JMX是一套标準的代理和服務,
實際上,使用者可以在任何Java應用程式中使用這些代理和服務實作管理。主要用于對JAVA應用程式和JVM進行監控和管理。
JConsole和JVisualVM中能夠監控到JAVA應用程式和JVM的相關資訊都是通過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的差別
- 在标準MBean中使用自定義資料類型時,JConsole中會顯示不可用;而在MXBean中可以正常所使用。
- 标準的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通知的使用