使用jmx-util简单、快速地进行JMX服务开发

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!

四年之前,正在做大型邮件系统的项目,主要负责基础组件的开发和维护,如:线程池、连接池、基于TCP自实现的HTTP长连接。当时,想实时了解生产环境中各个组件的内部运行状态和定时获取状态数据生成报表,从而分析和掌控系统的健康状况趋势,就利用JMX实现了该功能。
从公司离职后,利用空闲时间自己写一些东西,想到了一种更高效的实现JMX服务的方法,几行代码就可以搞定一个JMX服务,也就是现在的jmx-util。

功能

  • 封装普通的Java对象,使之成为符合JMX规范的MBean。
  • 根据指定的接口,暴露方法和属性。
  • 可自定义过滤器,过滤指定的方法和属性。

类关系图

jmx-util类关系图
  • IntrospectionMBean。实现了javax.management.DynamicMBean,负责将普通Java对象封装成MBean,它会调用IntrospectionFilter的实现类,过滤属性和方法。
  • IntrospectionFilter。过滤器接口定义,默认实现类有AbstractFilter、AttributeFilter、MethodFilter。可根据自已的需要继承AbstracFilter类或IntrospectionFilter接口实现属性和方法过滤器。
  • Description。描述注解,可应用于类和方法。

使用说明

1、将jmx-util-1.0.0.jar加入项目的classpath。

2、编写一个POJO类。源代码

3、编写注册MBean对象的代码。完整的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class HelloJmx {
public static void main(String[] args) throws Exception {
People zhs = new People();
zhs.setUserName("张三");
zhs.setAge(16);
zhs.setSex('M');
People ls = new People();
ls.setUserName("李四");
ls.setAge(18);
ls.setSex('M');
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
// 张三使用默认的方法和属性过滤器
ObjectName zhsObjectName = new ObjectName("cn.aofeng.jmx", "name", "张三");
Object zhsMBean = new IntrospectionMBean(zhs, People.class);
mbeanServer.registerMBean(zhsMBean, zhsObjectName);
// 李四使用自定义的方法和属性过滤器
IntrospectionFilter attributeFilter = new CustomAttributeFilter();
IntrospectionFilter methodFilter = new CustomMethodFilter();
ObjectName lsObjectName = new ObjectName("cn.aofeng.jmx", "name", "李四");
Object lsMBean = new IntrospectionMBean(ls, People.class, attributeFilter, methodFilter);
mbeanServer.registerMBean(lsMBean, lsObjectName);
Thread.sleep(1000 * 1000);
}
}
1
2
3
4
5
6
7
public static class CustomAttributeFilter extends AttributeFilter {
public CustomAttributeFilter() {
super();
super.filterNames.add("Class");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public static class CustomMethodFilter extends MethodFilter {
public CustomMethodFilter() {
super();
super.filterNames.add("equals");
super.filterNames.add("hashCode");
super.filterNames.add("toString");
super.filterNames.add("wait");
super.filterNames.add("notify");
super.filterNames.add("notifyAll");
}
}

4、运行HelloJmx。

5、打开JConsole,选择HelloJmx的进程。
JConsole界面

6、点击连接按钮,选择MBean选项卡。
MBean查看界面

下载

binary

source

JMX相关参考资料