JMX
,全稱Java Management Extensions
,用於咱們管理和監控java
應用程序。JMX
有如下用途:html
舉個例子,咱們能夠經過jconsole
監控應用程序的堆內存使用量、線程數、類數,查看某些配置信息,甚至能夠動態地修改配置。另外,有時還能夠利用JMX
來進行測試。java
本文將介紹如下內容:git
JMX
;JMX
的基礎架構;JMX
。首先,看下這種圖:github
這裏簡單介紹下這三層結構:安全
層次 | 描述 |
---|---|
Instrumentation | 主要包括了一系列的接口定義和描述如何開發MBean 的規範。在JMX 中MBean 表明一個被管理的資源實例,經過MBean 中暴露的方法和屬性,外界能夠獲取被管理的資源的狀態和操縱MBean 的行爲。 |
Agent | 用來管理相應的資源,而且爲遠端用戶提供訪問的接口。該層的核心是MBeanServer ,全部的MBean 都要向它註冊,才能被管理。註冊在MBeanServer 上的MBean 並不直接和遠程應用程序進行通訊,他們經過協議適配器(Adapter )和鏈接器(Connector )進行通訊。 |
Distributed | 定義了一系列用來訪問Agent的接口和組件,包括Adapter 和Connector 的描述。注意,Adapter 和Connector 的區別在於:Adapter 是使用某種Internet 協議來與Agent 得到聯繫,Agent 端會有一個對象 (Adapter )來處理有關協議的細節。好比SNMP Adapter 和HTTP Adapter 。而Connector 則是使用相似RPC 的方式來訪問Agent ,在Agent 端和客戶端都必須有這樣一個對象來處理相應的請求與應答。好比RMI Connector 。 |
MBean
。MBean
,包括代碼實現、啓動參數、啓動參數+配置文件等方式。JDK
:1.8.0_231架構
maven
:3.6.1eclipse
IDE
:eclipse 4.12maven
MBean
接口,並編寫實現類;MBean
到MBeanServe
;jconsole
鏈接管理該程序。項目類型Maven Project,打包方式jar
測試
入門案例暫時不須要引入外部依賴。this
注意,接口名格式必須爲:被管理的類的類名+MBean
。
public interface UserMBean { String getName(); void setName(String name); Integer getAge(); void setAge(Integer age); String getAddress(); void setAddress(String address); String sayHello(); }
這裏簡單實現下就行。當屬性被設置時,會在控制檯打印相關內容。
public class User implements UserMBean { private String name; private Integer age; private String address; public String getName() { return name; } public void setName(String name) { System.err.println("set name to " + name); this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { System.err.println("set age to " + age); this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { System.err.println("set address to " + address); this.address = address; } public String sayHello() { return "Hello!"; } }
路徑爲test
目錄下的cn.zzs.jmx
,類名JMXTest
。只有將MBean
註冊到MBeanServer
,MBean
才能被管理。MBean
的對象名格式爲:域名:type=MBean類型,name=MBean名稱
。其中,域名
和MBean名稱
能夠隨便取,對象名中除了type,咱們還能夠自定義其餘條目,以方便管理。
注意,爲了讓這個程序持續工做,這裏強制線程睡眠。
public static void main(String[] args) throws Exception { // 設置MBean對象名,格式爲:「域名:type=MBean類型,name=MBean名稱」 String jmxName = "cn.zzs.jmx:type=user,name=user001"; // 得到MBeanServer MBeanServer server = ManagementFactory.getPlatformMBeanServer(); // 建立ObjectName ObjectName objectName = new ObjectName(jmxName); // 建立並註冊MBean server.registerMBean(new User(), objectName); Thread.sleep(60 * 60 * 1000); }
啓動程序,打開jconsole
(在JDK
安裝路徑的bin
目錄下),出現以下界面,這時能夠看到咱們測試的程序:
選擇JMXTest
後,點擊鏈接,這時若是彈窗「安全鏈接失敗,是否以不安全的方式重試」,這是由於咱們沒有開啓ssl
加密,能夠不去理會它。點擊不安全的鏈接,便可進入如下頁面:
經過這個窗口咱們能夠查看程序的堆內存使用量、線程、類等信息,咱們再點擊MBean
選項卡,能夠看到咱們編寫的MBean
,咱們定義的對象名爲cn.zzs.jmx:type=user,name=user001
,其中cn.zzs.jmx
做爲第一級目錄,type=user
做爲第二級目錄,name=user001
對應具體的對象,它具有屬性和操做。其中,user
的setter
和getter
方法被合併在了一塊兒。
經過這個界面,咱們能夠查看和設置user
的屬性,或調用它的方法。例如,我先設置name的值,經過程序控制臺能夠看到該方法被調用了:
接着我再調用sayHello
方法:
經過以上例子,能夠看到,JMX
仍是很是有用的,除了查看類的屬性外,咱們還能夠在不重啓程序的狀況下進行配置或執行某些方法。
以上例子中,咱們只能在本地訪問JMXTest
,接下來介紹如何實現遠程鏈接。本文介紹三種方式,可根據實際場景選擇:
本例子在本地鏈接的基礎上修改。
注意,這裏的localhost
最好改成你的IP
,否則可能鏈接不上。
public static void main(String[] args) throws Exception { // 設置MBean對象名,格式爲:「域名:type=MBean類型,name=MBean名稱」 String jmxName = "cn.zzs.jmx:type=user,name=user001"; // 得到MBeanServer MBeanServer server = ManagementFactory.getPlatformMBeanServer(); // 建立ObjectName ObjectName objectName = new ObjectName(jmxName); // 建立並註冊MBean server.registerMBean(new User(), objectName); // 註冊一個端口 LocateRegistry.createRegistry(9999); // URL路徑的結尾能夠隨意指定,但若是須要用Jconsole來進行鏈接,則必須使用jmxrmi JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server); jcs.start(); }
打開jconsole
,使用遠程鏈接方式,輸入咱們設置好的ip和端口,點擊鏈接便可:
本例子在本地鏈接的基礎上修改。在程序啓動時加入如下啓動參數,也能夠實現遠程鏈接:
-Djava.rmi.server.hostname=<your-ip> // 你的ip -Dcom.sun.management.jmxremote.port=9999 // 開放端口號 -Dcom.sun.management.jmxremote.local.only=false // 是否只能本地鏈接 -Dcom.sun.management.jmxremote.ssl=false // 是否使用ssl加密 -Dcom.sun.management.jmxremote.authenticate=false // 是否須要帳號密碼認證
能夠看到,咱們關閉了ssl
加密和帳號密碼認證。
本例子在本地鏈接的基礎上修改。
在程序啓動時加入如下啓動參數,並結合配置文件,也能夠實現遠程鏈接:
-Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties // 配置文件路徑 -Djava.rmi.server.hostname=<your-ip>
在配置文件中配置如下參數:
# 開放端口號 com.sun.management.jmxremote.port=9999 # 是否只能本地鏈接 com.sun.management.jmxremote.local.only=false # 是否使用ssl加密 com.sun.management.jmxremote.ssl=false # 是否須要帳號密碼認證 com.sun.management.jmxremote.authenticate=false
關於management.propertie
的詳細配置,能夠在$JRE/lib/management/
目錄下找到。其實,當咱們在啓動參數中存在如下參數時,默認會去讀取$JRE/lib/management/management.properties
的配置文件。
# -Dcom.sun.management.jmxremote.port=<port-number> # or -Dcom.sun.management.snmp.port=<port-number>
實際使用中,咱們更但願採用安全加密的方式來監控程序,這個時候咱們能夠設置ssl加密或帳號密碼認證。ssl加密的本文暫時不擴展,這裏只介紹如何設置帳號密碼認證。
和上個例子同樣,須要設置以下啓動參數:
-Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties -Djava.rmi.server.hostname=<your-ip>
配置文件中加入如下內容:
# 開放端口號 com.sun.management.jmxremote.port=9999 # 是否只能本地鏈接 com.sun.management.jmxremote.local.only=false # 是否使用ssl加密 com.sun.management.jmxremote.ssl=false # 是否須要帳號密碼認證 com.sun.management.jmxremote.authenticate=true # 密碼文件路徑 com.sun.management.jmxremote.password.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.password # 權限文件路徑 com.sun.management.jmxremote.access.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.access
在此以前,咱們須要配置好密碼文件和權限文件:
密碼文件
ZhangZiSheng001 root
權限文件
ZhangZiSheng001 readwrite
打開jconsole
,選擇遠程鏈接,並輸入帳號密碼,點擊鏈接便可:
本文爲原創文章,轉載請附上原文出處連接:http://www.javashuo.com/article/p-fmrknyqt-a.html