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