一、JMX介紹
JMX(Java Management Extensions,即Java管理擴展)是一個為應用程序、設備、系統等植入管理功能的框架。JMX可以跨越一系列異構操作系統平台、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。
1、簡介
JMX在Java編程語言中定義了應用程序以及網絡管理和監控的體系結構、設計模式、應用程序接口以及服務。通常使用JMX來監控系統的運行狀態或管理系統的某些方面,比如清空緩存、重新加載配置文件等
優點是可以非常容易的使應用程序被管理
伸縮性的架構使每個JMX Agent服務可以很容易的放入到Agent中,每個JMX的實現都提供幾個核心的Agent服務,你也可以自己編寫服務,服務可以很容易的部署,取消部署。
主要作用是提供接口,允許有不同的實現
2、分層
JMX體系結構分為以下四個層次:
設備層
設備層(Instrumentation Level):主要定義了信息模型。在JMX中,各種管理對象以管理構件的形式存在,需要管理時,向MBean服務器進行注冊。該層還定義了通知機制以及一些輔助元數據類。
代理層
代理層(Agent Level):主要定義了各種服務以及通信模型。該層的核心是一個MBean服務器,所有的管理構件都需要向它注冊,才能被管理。注冊在MBean服務器上管理構件並不直接和遠程應用程序進行通信,它們通過協議適配器和連接器進行通信。而協議適配器和連接器也以管理構件的形式向MBean服務器注冊才能提供相應的服務。
包含JMX Agent以及它們包含的MBean Servers。Agent layer的主要組件是MBean server,作為JMX Agents的核心,它充當MBeans的注冊中心。該層提供了4個Agent 服務來使對MBean的管理更容易:計時器(Timer)、監控(monitoring)、動態加載MBean(dynamic MBean loading )、關系服務(relationship services )
分布服務層
分布服務層(Distributed Service Level):主要定義了能對代理層進行操作的管理接口和構件,這樣管理者就可以操作代理。然而,當前的JMX規范並沒有給出這一層的具體規范。
附加管理協議API
定義的API主要用來支持當前已經存在的網絡管理協議,如SNMP、TMN、CIM/WBEM等。
3、其他概念
MBean:是Managed Bean的簡稱。在JMX中MBean代表一個被管理的資源實例,通過MBean中暴露的方法和屬性,外界可以獲取被管理的資源的狀態和操縱MBean的行為。事實上,MBean就是一個Java Object,同JavaBean模型一樣,外界使用自醒和反射來獲取Object的值和調用Object的方法,只是MBean更為復雜和高級一些。
MBeanServer:MBean生存在一個MBeanServer中。MBeanServer管理這些MBean,並且代理外界對它們的訪問。並且MBeanServer提供了一種注冊機制,是的外界可以通過名字來得到相應的MBean實例。
JMX Agent:Agent只是一個Java進程,它包括這個MBeanServer和一系列附加的MbeanService。當然這些Service也是通過MBean的形式來發布。
Protocol Adapters and Connectors
JMX Agent通過各種各樣的Adapter和Connector來與外界(JVM之外)進行通信。同樣外界(JVM之外)也必須通過某個Adapter和Connector來向JMX Agent發送管理或控制請求。
Adapter和Connector的區別在於:Adapter是使用某種Internet協議來與JMX Agent獲得聯系,Agent端會有一個對象(Adapter)來處理有關協議的細節。比如SNMP Adapter和HTTP Adapter。而Connector則是使用類似RPC的方式來訪問Agent,在Agent端和客戶端都必須有這樣一個對象來處理相應的請求與應答。比如RMI Connector。
JMX Agent可以帶有任意多個Adapter,因此可以使用多種不同的方式訪問Agent。
二、JMX使用
1、建立一個MBean接口和實現類
HelloMBean.java:
1 public interface HelloMBean { 2 // management attributes 3 public String getName(); 4 5 public void setName(String name); 6 7 // management operations 8 public void print(); 9 }
實現類Hello.java:
1 public class Hello implements HelloMBean { 2 private String name = ""; 3 4 public String getName() { 5 return name; 6 } 7 8 public void setName(String name) { 9 this.name = name; 10 } 11 12 public void print() { 13 System.out.println("Hello, " + name + "!!"); 14 } 15 }
2、創建MBeanServer
1 public class HelloAgent { 2 private MBeanServer server; 3 4 public HelloAgent() { 5 6 // CREATE the MBeanServer 7 System.out.println("\n\tCREATE the MBeanServer."); 8 this.server = ManagementFactory.getPlatformMBeanServer(); 9 10 // CREATE Registe HelloMBean 11 System.out.println("\n\tCREATE, REGISTER a new Hello Standard_MBean:"); 12 Hello hello = new Hello(); 13 hello.setName("xxx"); 14 ObjectName hello_name = null; 15 try{ 16 hello_name = new ObjectName("jmxBean:name=Hello "); 17 System.out.println("\tOBJECT NAME = " + hello_name); 18 //將HelloMBean注冊到MBeanServer中去 19 server.registerMBean(hello, hello_name); 20 21 Thread.sleep(60*60*1000); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } 25 } 26 27 28 public static void main(String args[]) { 29 HelloAgent agent = new HelloAgent(); 30 } 31 32 }
3、運行代碼
運行HelloAgent的main方法
4、使用Jconsole訪問jmx
1、打開jconsole,連接
2、查看屬性
3、調用方法
參考:
https://baike.baidu.com/item/JMX/2829357?fr=aladdin
https://www.cnblogs.com/duanxz/category/689081.html
https://www.cnblogs.com/dongguacai/p/5900507.html