Skip to content
Calvin edited this page Nov 13, 2013 · 8 revisions

##Overview JMX曾经是一个很吃香的监控/管理协议,那些非Java的应用都要羡慕JavaEE有这样的标准协议。

但随着时间推移,JMX也显示出一定的局限性,首先它的协议只有Java一族的应用自己能懂,不符合现在平台大混合的潮流。 另外它的使用也依赖于有XWindows的机器启动的JConsole, 或者某些应用服务器提供的,功能有限的Web界面。 这时,像MongoDB提供的JSON格式的Restful监控管理接口,给人感觉更加好用。

幸好,这时候出来一个Jolokia,可以把JMX的MBean Restful JSON 化。

Jolokia

使用超简单,只要将一个Servlet加入web.xml中,然后就可以用一些restful的url来获取属性,设置属性和调用MBean函数了。

见SpringSide showcase 示例,在jmx.jsp里,演示了数种典型的用法:

  • 获取showcase下所有MBean的所有属性: /jolokia/read/showcase:name=*
  • 获取ApplicationStatistics MBean下的所有属性: /jolokia/read/showcase:name=ApplicationStatistics
  • 只获取MBean下的ListUserTimes属性: /jolokia/read/showcase:name=ApplicationStatistics/ListUserTimes
  • 设置设置Root Logger Level属性: /jolokia/write/log4j:name=Log4j/RootLoggerLevel/INFO
  • 执行获取特定Logger的Level的命令:/jolokia/exec/log4j:name=Log4j/getLoggerLevel/org.springside.showcase
  • 列出showcase域下的所有MBean及其描述: /jolokia/list/showcase

返回值看起来是这个样子的, 前面部分是关于请求的复述,value部分是返回值:

{"timestamp":1335280389,"status":200,
"request":{"mbean":"showcase:name=ApplicationStatistics","type":"read"},
"value":{"UpdateUserTimes":0,"ListUserTimes":0}}

最后,提醒一下注意安全,最好用Shiro的URL Filter之类的机制将/jolokia/* 保护起来.

Spring JMX

为了将一个POJO变为MBean,一个做法是定义一个XXXXMBean为名的接口,然后实现它。
而Spring提供了一种更简单的方法,只需要使用@ManagedResourc这样的Annotation注释即可,既可以将POJO变为MBean,还可以为属性,方法及其参数都加上描述,为JConsole进行操作时提供更好的帮助信息。

SpringSide core中的Log4jManager 和 showcase中的ApplicationStatistics都是例子。 注意如果属性是可读可写的,就在getter和setter上都注释@ManagedAttribute,只读的话就只在getter上注释。

让Spring JMX工作很简单,參考springside showcase 中的 applicationContext-jmx.xml,加入

  <context:mbean-export default-domain="showcase" registration="replaceExisting" />

支持JMX远程连接

如果是用Jolokia将JMX Restful JSON的话,远程连接就不是必须的。如果仍然要远程连接,可以在启动JVM时加上系统参数

-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=3099

JConsole

如果JConsole与应用在同一台机器,直接选择该进程
远程进程URL可以简单的写host:port 如 localhost:2099 ,练打字的话写完整版的service:jmx:rmi:///jndi/rmi://localhost:2099/jmxrmi

Clone this wiki locally