jmx全称是Java Management Extensions 是java的一种扩展管理工具,可以通过网页或者客户端的方式管理正在运行的java服务,例如Tomcat的容器停止或者重启。Tomcat基于jmx开发的,Jboss也是类似的,数据库连接池druid也有同样的功能。拥有jmx意味着可以通过在页面上动态调整服务。如下图jmx架构图
由上面的图片可以看出mbean分为三层,分别是基础层、代理层,远程管理层
- 基础层mbean,分为了标准Mbean、动态Mbean、mxbean等
- 代理层(适配层)提供对mbean的管理
- 远程管理层 可以通过http、snmp、rmi等不同的协议去管理具体的mbean资源
StandardMBean
使用StandardMBean 必须为每一个MBean定义一个接口,而且名字限定为xxxMBean
// 接口
public interface DemoMBean {
public String getName();
public int getAge();
public void setName(String name);
public void setAge(int age);
void init();
}
// 具体实现
public class Demo implements DemoMBean {
private String name;
private int age;
@Override
public String getName() {
return name;
}
@Override
public int getAge() {
return age;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void init() {
this.age = 10;
this.name = "hehehehehe";
}
}
// agent
public class DemoAgent {
public static void main(String[] args) {
try {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
String domainName = "DemoMBean";
// 为MBean(下面的new Hello())创建ObjectName实例
ObjectName demo = new ObjectName(domainName + ":name=Demo");
// 将demo对象注册到MBeanServer上去
server.registerMBean(new Demo(), demo);
Thread.sleep(60*60*1000);
// demo而已,便于测试,加上了这个线程睡眠
} catch (Exception e){
e.printStackTrace();
}
}
}
// 系统默认的赋值
// 触发init方法
// 触发init函数,运行完值已经发生变化了
这样我们就可以在本地通过jconsole动态修改了服务内的数据,在实际发开中,存在修改线上配置文件的属性,除了重新部署修改之外,也可以通过类似的方案实现。
除了本地jconsole工具管理mbean,还可以通过rmi、http等方式管理,原理也类似,遵循jmx的使用协议,在原本写好的agent上再包装一层提供给外界使用。