JMX中的描述说明
在开发工作中,会时常遇到通过JMX对应用进行监控、管理,此时JMX MBean自身的描述信息就很重要了 (否则Swagger UI也不会那么火。。。)。但是,在实际应用中,我们会发现自己写的MBean是没有意义的,都是默认的值,说的不错但是是废话,而别人家的MBean是这样的(以Tomcat为例),是有意义的,能知道这个是干啥的。
感谢Tomcat是开源的,赶紧看看人家怎么实现的吧。。。
通过学习(学习过程会在其他地方说明),结论就是:Tomcat中的使用的MBean是DynamicMBean,而我们开发使用的是StandardMBean,而DynamicMBean是可以通过getMBeanInfo()获得MBeanInfo对象实例,进而获取具体的描述信息的。
那么问题来了,StandardMBean怎么添加描述信息呢?必应一下,发现如果单纯的JDK环境貌似不行啊。。。理由如下:
实际上所有的MBean在向MBean Server注册时最终都会被转化为DynamicMBean,详见com.sun.jmx.mbeanserver.Introspector.makeDynamicMBean(Object)方法
StandardMBean、MXBean在转化过程中使用的是它们的接口通过反射获取JMX操作、属性的,这个也完全符合它们的编写要求。
在将StandardMBean、MXBean转化的过程中,他们的MBeanInfo中的描述信息只能使用默认值了:
类型 | 默认值 |
---|---|
类 | Informationon the management interface of the MBean |
构造方法 | Public constructor of the Mbean |
属性 | Attribute exposed for management |
操作 | Operation exposed for management |
结论
综上所述:
- JMX中MBean的描述信息几乎完全来源于MBeanInfo对象实例,此对象实例来源于getMBeanInfo方法。
- 虽然所有的MBean在最终注册时都会转化为DynamicMBean,但是StandardMBean以及MXBean只能使用默认的描述说明信息。
- 在大量使用JMX的场景推荐直接使用DynamicMBean,参照Tomcat。