Skip to main content
 首页 » 编程设计

Java Management Extensions(JMX)入门教程

2022年07月19日141thcjp

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技术的领域非常广泛,本教程仅为初学者入门篇。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/103538224
阅读延展