【Java】JMX入門
一、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