1. 概述

Java Management Extensions (JMX) 框架自Java 1.5起引入,并自那时起在Java开发者社区中得到了广泛接受。它提供了一种易于配置、可扩展、可靠且相对友好的基础设施,用于本地或远程管理Java应用。框架引入了MBeans的概念,以实现实时应用程序管理。

本文是一篇针对初学者的逐步指南,介绍如何创建并设置基本的MBean,并通过JConsole进行管理。

2. JMX架构

JMX架构遵循三层结构:

  1. 仪器化层: 通过JMX代理注册MBeans,用于管理资源
  2. JMX代理层: 核心组件(MBeanServer),维护受管MBeans的注册表,并提供访问它们的接口
  3. 远程管理层: 通常为JConsole等客户端工具

3. 创建MBean类

在创建MBeans时,我们必须遵循特定的设计模式。模型MBean类必须实现一个接口,接口名称为:"model class name" + MBean

首先定义我们的MBean接口和实现它的类:

public interface GameMBean {

    public void playFootball(String clubName);

    public String getPlayerName();

    public void setPlayerName(String playerName);

}
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()方法。此外,类中有一个成员变量playerName,以及对应的getter和setter。

请注意,getter和setter也在父接口中声明。

4. 使用JMX代理进行仪器化

JMX代理是运行在本地或远程的实体,它们提供了对注册到它们的MBeans的管理访问权限。

我们将使用PlatformMbeanServer——JMX代理的核心组件,并将Game MBean注册到其中。

我们还会使用另一个实体ObjectName——将Game 类实例与PlatformMbeanServer注册,它是一个由逗号分隔的“key=value”对组成的字符串:

  • :可以是任意字符串,但根据MBean命名约定,应使用Java包名(避免命名冲突)
  • :一系列键值对列表

在这个例子中,我们将使用:"com.baledung.tutorial:type=basic,name=game"。

我们将从java.lang.management.ManagementFactory工厂类获取MBeanServer,然后使用创建的ObjectName注册模型MBean:

try {
    ObjectName objectName = new ObjectName("com.baeldung.tutorial:type=basic,name=game");
    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    server.registerMBean(new Game(), objectName);
} catch (MalformedObjectNameException | InstanceAlreadyExistsException |
        MBeanRegistrationException | NotCompliantMBeanException e) {
    // handle exceptions
}

最后,为了能够测试,我们将在应用结束前添加一个while循环:

while (true) {
}

5. 访问MBean

5.1. 从客户端连接

  1. 在Eclipse中启动应用
  2. 启动JConsole(位于你机器上JDK安装目录的bin文件夹中)
  3. 连接 > 新建连接 > 选择本教程的本地Java进程 > 连接 > 不安全的SSL连接警告 > 继续使用不安全连接
  4. 建立连接后,点击视图面板右上角的MBeans标签页
  5. 左侧列将显示已注册的MBeans
  6. 点击com.baeldung.tutorial > basic > game
  7. game下,将看到两行,分别对应属性和操作

以下是JConsole部分过程的快速预览:

编辑过的JMX教程

5.2. 管理MBean

MBean的基本管理很简单:

  • 属性可以读取或写入
  • 方法可以调用,可以提供参数,也可以从它们返回值

让我们看看Game MBean在实际操作中的含义:

  • 属性: 为属性playerName输入新值,例如“Messi”,然后点击刷新按钮

将在Eclipse控制台输出: 将playerName设置为值Messi

  • 操作:playFootBall()方法的String参数输入值,例如“Barcelona”,然后点击方法按钮。将出现一个成功调用的窗口提示

Eclipse控制台将输出: Messi正在为Barcelona踢足球

6. 结论

本文介绍了如何通过MBeans启用JMX功能的应用设置,以及如何使用像JConsole这样的典型客户端工具进行管理。JMX技术的领域非常广泛,本文可以被视为迈向这个领域的初学者步骤。

本教程的源代码可以在GitHub上找到。