Java Management Extensions(JMX)入門教程

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技術的領域非常廣泛,本教程僅爲初學者入門篇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章