Java Management Extensions(JMX)入門教程
Java Management Extensions (JMX) 自Java 1.5引入,從此被Java開發社區廣泛接受。它爲本地或遠程管理Java應用程序提供了易於配置、可伸縮、可靠且較友好的基礎設施。該框架引入了用於實時管理應用程序的mbean概念。本文爲初學者提供JMX入門教程,包括創建和配置基本的MBean,並通過JConsole工具進行管理。
1. JMX架構
JMX架構採用三層架構:
-
裝配層(Instrumentation layer)
定義通過JMX代理註冊的MBean,從而實現資源管理。
-
代理層(JMX agent layer)
核心組件(MbeanServer),負責維護託管MBean的註冊表並提供訪問接口。
-
遠程管理層(Remote management layer)
客戶端工具,如JConsole。
2. 示例
2.1. 創建MBean類
MBean類需遵循特定的設計規範,MBean模型類必須實現接口,接口名稱爲模型類名加上MBean。下面定義MBean接口及其類的實現:
package com.dataz.mbeans;
public interface GameMBean {
public void playFootball(String clubName);
public String getPlayerName();
public void setPlayerName(String playerName);
}
對應實現類爲:
package com.dataz.mbeans;
public class Game implements GameMBean {
private String playerName;
@Override
public void playFootball(String clubName) {
System.out.println(
this.playerName + " playing football for " + clubName);
}
@Override
public String getPlayerName() {
System.out.println("Return playerName " + this.playerName);
return playerName;
}
@Override
public void setPlayerName(String playerName) {
System.out.println("Set playerName to value " + playerName);
this.playerName = playerName;
}
}
Game類重寫接口方法playFootball(),另外類還有成員變量planName以及getter/setter方法。注意getter/setter方法也需要在接口中聲明。
2.2. 通過代理註冊MBean
JMX代理是運行本地或遠程的實體,提供對註冊的MBean進行管理訪問。這裏使用JMX代理的核心組件PlatformMbeanServer註冊Game MBean。
同時使用另一個實體————ObjectName註冊Game類實例,有兩部分字符串表示:
- 域(domain)
可以是任意字符串,但遵循MBean命名規範,應該爲Java包名(避免名稱衝突)
- 鍵值對
一組使用逗號分隔的鍵值對。
我們的示例使用ObjectName:“com.dataz.mbeans:type=basic,name=game”;
完整代碼如下:
package com.dataz.mbeans;
import javax.management.*;
import java.lang.management.ManagementFactory;
public class JMXTutorialMainlauncher {
public static void main(String[] args) {
debug("This is basic JMX tutorial");
ObjectName objectName = null;
try {
objectName = new ObjectName("com.dataz.mbeans:type=basic,name=game");
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
Game gameObj = new Game();
try {
server.registerMBean(gameObj, objectName);
} catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
e.printStackTrace();
}
debug("Registration for Game mbean with the platform server is successfull");
debug("Please open jconsole to access Game mbean");
while (true) {
// to ensure application does not terminate
}
}
public static void debug(String info) {
System.out.println(info);
}
}
其中獲取MBeanServer的代碼爲:
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
註冊模型MBean類的代碼:
ObjectName objectName = null;
try {
objectName = new ObjectName("com.baeldung.tutorial:type=basic,name=game");
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
最後爲了測試方便,使用while循環避免程序在JConsole訪問其之前退出。
2.3 訪問MBean
- 首先啓動項目
- 啓動JConsole(jdk的bin目錄下)
- 在Jconsole的菜單中選擇連接->新建連接->選擇本地啓動的應用->連接->出現不安全連接警告->繼續使用不安全連接
- 連接建立後,點擊上面最右邊的選項卡MBean
- 點擊com.dataz.mbeans->basic->game
- 在game下,有兩行,分別爲屬性和操作
2.4 管理MBean
MBean管理的基礎比較簡單:
- 屬性的讀寫
- 方法調用,傳入參數或返回值
下面看如何管理Game MBean:
屬性
可以給playName輸入新的值,如tommy,然後點擊刷新按鈕,應用會打印日誌信息。
操作
給playFootBall()方法輸入參數,如dataz,點擊方法按鈕,彈出方法執行成功對話框。後臺打印日誌:
tommy playing football for dataz
3. 總結
本教程介紹了使用mbean設置啓用jmx應用程序的基礎知識。同時還討論瞭如何使用典型的客戶端工具(如JConsole)來管理註冊的MBean。
JMX技術的領域非常廣泛,本教程僅爲初學者入門篇。