JMX,即Java Management Extensions,Java管理扩展。是一个为应用程序、设备、系统等植入管理功能的框架。
JMX提供了一种简单、基础的方法,用来管理应用、设置、服务等资源。由于JMX是动态的,你可以使用JMX技术来监控和管理处于创建、安装和运行态的资源。你甚至可以使用JMX技术监控和管理虚拟机。
JMX架构图:
可以看出,JMX分为三层
- 基础层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;@Overridepublic String getName() {return name;}@Overridepublic int getAge() {return age;}@Overridepublic void setName(String name) {this.name = name;}@Overridepublic void setAge(int age) {this.age = age;}@Overridepublic 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上再包装一层提供给外界使用。
参考链接:
https://www.cnblogs.com/trust-freedom/p/6842332.html