JMX
JMX(Java Management Extensions),含义为Java管理扩展的缩写,是一个为应用程序植入管理功能的框架,提供了一种简单的、标准的监控和管理资源的方式。
JMX 应用场景
JMX有以下典型的应用场景:
- 监控应用程序的运行状态和相关统计信息;
- 修改应用程序的配置(无需重启);
- 状态变化或出错时通知处理。
举个例子,我们可以通过jconsole监控应用程序的堆内存使用量、线程数、类数,查看某些配置信息,甚至可以动态地修改配置。
下图是使用Jconsle通过JMX查看Java程序的运行信息:
图片
JMX最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或VisualVM进行预览。
JMX 的技术架构
图片
从图中我们可以看到,JMX的结构一共分为三层:
1、基础层:主要是MBean,被管理的资源。
MBean分为如下四种:
图片
2、适配层:主要是提供对资源的注册和管理。
Agent层 用来管理相应的资源,并且为远端用户提供访问的接口。
Agent层主要定义了各种服务以及通信模型,该层的核心是 MBeanServer,所有的MBean都要向它注册,才能被管理。
注册在MBeanServer上的MBean并不直接和远程应用程序进行通信,他们通过 协议适配器(Adapter) 和 连接器(Connector) 进行通信。
通常Agent由一个MBeanServer和多个系统服务组成。
3、接入层:提供远程访问的入口。
怎么使用JMX
下面我们就简单的使用jmx来实现配置bean属性的动态修改,动态修改的意思就是在不重启服务器的情况下,实现配置属性的变更。
第一步:提供管理信息
1) 首先定义一个MBean接口,接口的命名规范为以具体的实现类为前缀(这个规范很重要)
//接口要以MBean结尾
public interface HelloMBean {
String getName();
void setName(String name);
}
2)定义一个实现类,实现上面的接口
//实现类跟接口在同一个包中,且名字不包含MBean
public class Hello implements HelloMBean {
private String name;
@Override
public String getName() {
System.out.println("Hello.getName");
return name;
}
@Override
public void setName(String name) {
this.name = name;
System.out.println("Hello.setName");
}
}
第二步:使用jconsole连接
jconsole是jdk自带工具,在配置了jdk环境之后,我们只需要在cmd命令行中输入jconsole即可。
如下图所示:
图片
然后我们就可以在这里来进行Name属性的修改。
第三步:控制打印结果