【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM