项目地址上传至GitHub,地址是 https://github.com/zbkpointer/JMXProject.git,欢迎下载运行。
1 JMX 组成三要素及应用Case
- 代理服务器
- MBean对象
- 客户端
三者的关系如下图所示。
JMX应用场景有:Zookeeper、Kafka的某些指标监控,都是通过JMX实现。
2 JMX MBean对象种类
- Standard MBeans
- Dynamic MBeans
- Open MBeans
- Model MBeans
- MXBeans
3 JMX 核心要义
客户端通过访问代理服务器达到掌控MBean对象的目的,MBean对象可以是设备、资源或者整个程序。
4 JMX 官方例子
1.项目预览
2.Standard MBeans 构建
首先是编写Standard MBeans接口
public interface HelloMBean { public void sayHello(); public int add(int x, int y); public String getName(); public int getCacheSize(); public void setCacheSize(int size); }
接着是编写Standard MBeans接口的实现类
public class Hello implements HelloMBean{ private final String name = "Reginald"; private int cacheSize = DEFAULT_CACHE_SIZE; private static final int DEFAULT_CACHE_SIZE = 200; public void sayHello() { System.out.println("hello, world"); } public int add(int x, int y) { return x + y; } public String getName() { return this.name; } public int getCacheSize() { return this.cacheSize; } public synchronized void setCacheSize(int size) { this.cacheSize = size; System.out.println("Cache size now " + this.cacheSize); } }
最后是创建管理代理服务器
public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.zbk:type=Hello"); Hello mbean = new Hello(); mbs.registerMBean(mbean, name); System.out.println("Waiting forever..."); Thread.sleep(Long.MAX_VALUE); }
笔者认为代理服务器使用反射原理获取MBean的属性和动作,进而通过服务接口调用MBean的信息,使得客户端能够从外部对MBean进行操作。
5 使用Jconsole修改程序内部参数
Jconsole的位置在"\jdk8\bin\jconsole.exe"
,双击打开即可。连接该项目主线程。
切换Tab到MBean栏,打开所属项目,就可看到属性和操作。
点击操作中的sayHello()方法,会出现下图所示的动作。
附件
名词解释:
RMI: Remote Method Invocation