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。