读书人

Spring与MX4J集成兑现JMX管理 (转载)

发布时间: 2012-10-30 16:13:35 作者: rapoo

Spring与MX4J集成实现JMX管理 (转载)

MX4J是一个开源JMX管理框架,支持JSR3 (JMX) 和JSR160 (JMX RemoteAPI)。通过Spring将MX4J集成到我们的应用系统中,可以通过HTTP协议适配,能够基于Web的方式来实现对应用系统的监控和管理。这里,使用的版本分别为:Spring 2.5

MX4J 3.0.2

MX4J对应的几个JAR文件,加入到CLASSPATH:

mx4j.jarmx4j-impl.jarmx4j-jmx.jarmx4j-remote.jarmx4j-rimpl.jarmx4j-rjmx.jarmx4j-tools.jar

首先,给出Spring的完整配置,如下所示:

view plain
  1. <?xml?version="1.0"?encoding="UTF-8"?>??<beans?xmlns="http://www.springframework.org/schema/beans"??
  2. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:p="http://www.springframework.org/schema/p"??????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">??
  3. ??????<bean?id="exporter"?class="org.springframework.jmx.export.MBeanExporter"??
  4. ????????depends-on="mbeanServer">??????????<property?name="beans">??
  5. ????????????<map>??????????????????<entry?key="CONFIG.SHIRDRN.ORG:name=config"?value-ref="config"?/>??
  6. ????????????????<entry?key="MX4J.SOURCEFORGE.COM:name=httpAdaptor"?value-ref="httpAdaptor"?/>??????????????????<!--?
  7. ????????????????<entry?key="jdmk.sun.com:name=adaptorServer"?value-ref="adaptorServer"?/>?????????????????-->??
  8. ????????????</map>??????????</property>??
  9. ????????<property?name="server"?ref="mbeanServer"?/>??????????<property?name="assembler">??
  10. ????????????<ref?bean="assembler"?/>??????????</property>??
  11. ????</bean>??????<bean?id="assembler"??
  12. ????????class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">??????????<property?name="managedInterfaces">??
  13. ????????????<list>??????????????????<value>org.shirdrn.jmx.mx4j.SelectedMethodsInterface</value>??
  14. ????????????</list>??????????</property>??
  15. ????</bean>??????<bean?id="mbeanServer"?class="org.springframework.jmx.support.MBeanServerFactoryBean"?/>??
  16. ????<bean?id="httpAdaptor"?class="mx4j.tools.adaptor.http.HttpAdaptor">??????????<property?name="processor">??
  17. ????????????<ref?bean="xsltProcessor"?/>??????????</property>??
  18. ????????<property?name="host">??????????????<value>172.20.9.23</value>??
  19. ????????</property>??????????<property?name="port"?value="9988"?/>??
  20. ????</bean>??????<bean?id="xsltProcessor"?class="mx4j.tools.adaptor.http.XSLTProcessor"?/>??
  21. ????<bean?id="config"?class="org.shirdrn.jmx.mx4j.MyConfiguration"?/>????????
  22. ????<!--??????<bean?id="adaptorServer"?class="com.sun.jdmk.comm.HtmlAdaptorServer">??
  23. ????????<property?name="port">??????????????<value>9999</value>??
  24. ????????</property>??????</bean>??
  25. ????-->????
  26. </beans>???

上面配置中,比较核心的是MX4J的HTTP适配器类:mx4j.tools.adaptor.http.HttpAdaptor,它有一个processor属性,使用MX4J已经实现的mx4j.tools.adaptor.http.XSLTProcessor来对其注入。XSLTProcessor实现了MX4J定义的XML转换成为浏览器可以解析的格式的文档,就Web网页。

通过MX4J的源码可以看到,在mx4j-3.0.2/src/tools/mx4j/tools/adaptor/http/xsl目录下面,可以看到MX4J定义的一些XSLT模板,例如serverbydomain.xsl为Web控制台首页模板:

view plain
  1. <?xml?version="1.0"?>??<!--??
  2. ?Copyright?(C)?The?MX4J?Contributors.???All?rights?reserved.??
  3. ???This?software?is?distributed?under?the?terms?of?the?MX4J?License?version?1.0.??
  4. ?See?the?terms?of?the?MX4J?License?in?the?documentation?provided?with?this?software.????
  5. ?Author:?Carlos?Quiroz?(tibu@users.sourceforge.net)???Revision:?$Revision:?1.2?$??
  6. ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????-->??<xsl:stylesheet?xmlns:xsl="http://www.w3.org/1999/XSL/Transform"?version="1.0">??
  7. ???<xsl:output?method="html"?indent="yes"?encoding="ISO-8859-1"/>?????<xsl:include?href="common.xsl"?mce_href="common.xsl"/>??
  8. ???<xsl:include?href="xalan-ext.xsl"?mce_href="xalan-ext.xsl"/>????
  9. ???<xsl:param?name="html.stylesheet">stylesheet.css</xsl:param>?????<xsl:param?name="html.stylesheet.type">text/css</xsl:param>??
  10. ???<xsl:param?name="head.title">serverbydomain.title</xsl:param>????
  11. ???<!--?Invoked?when?a?query?error?is?produced?-->?????<xsl:template?match="Domain"?name="error">??
  12. ??????<xsl:for-each?select="Exception">???????????<tr>??
  13. ????????????<td?class="serverbydomain_domainline"?colspan="5">?????????????????<xsl:call-template?name="str">??
  14. ??????????????????<xsl:with-param?name="id">serverbydomain.error.query</xsl:with-param>????????????????????<xsl:with-param?name="p0">??
  15. ?????????????????????<xsl:value-of?select="@errorMsg"/>????????????????????</xsl:with-param>??
  16. ???????????????</xsl:call-template>??????????????</td>??
  17. ?????????</tr>????????</xsl:for-each>??
  18. ???</xsl:template>????
  19. ???<!--?Invoked?to?display?each?domain?-->?????<xsl:template?match="Domain"?name="domain">??
  20. ??????<xsl:for-each?select="Domain">???????????<xsl:sort?data-type="text"?order="ascending"?select="@name"/>??
  21. ?????????<tr>??????????????<td?class="serverbydomain_domainline"?colspan="5">??
  22. ???????????????<xsl:call-template?name="str">????????????????????<xsl:with-param?name="id">serverbydomain.domain.label</xsl:with-param>??
  23. ??????????????????<xsl:with-param?name="p0">???????????????????????<xsl:value-of?select="@name"/>??
  24. ??????????????????</xsl:with-param>?????????????????</xsl:call-template>??
  25. ????????????</td>??????????????<xsl:call-template?name="mbean"/>??
  26. ?????????</tr>????????</xsl:for-each>??
  27. ???</xsl:template>????
  28. ???<!--?invoked?for?each?mbean?-->?????<xsl:template?match="MBean"?name="mbean">??
  29. ??????<xsl:for-each?select="MBean">???????????<xsl:sort?data-type="text"?order="ascending"?select="@objectname"/>??
  30. ?????????<xsl:variable?name="classtype">??????????????<xsl:if?test="(position()?mod?2)=1">darkline</xsl:if>??
  31. ????????????<xsl:if?test="(position()?mod?2)=0">clearline</xsl:if>???????????</xsl:variable>??
  32. ?????????<xsl:variable?name="objectname">??????????????<xsl:call-template?name="uri-encode">??
  33. ???????????????<xsl:with-param?name="uri"?select="@objectname"/>??????????????</xsl:call-template>??
  34. ?????????</xsl:variable>???????????<tr?class="{$classtype}"?width="100%">??
  35. ????????????<td?width="35%"?align="left"?class="serverbydomain_row">?????????????????<a?href="mbean?objectname={$objectname}"?mce_href="mbean?objectname={$objectname}">??
  36. ??????????????????<xsl:value-of?select="@objectname"/>?????????????????</a>??
  37. ????????????</td>??????????????<td?width="20%"?align="left"?class="serverbydomain_row">??
  38. ???????????????<p>????????????????????<xsl:value-of?select="@classname"/>??
  39. ???????????????</p>??????????????</td>??
  40. ????????????<td?width="35%"?align="left"?class="serverbydomain_row">?????????????????<p>??
  41. ??????????????????<xsl:value-of?select="@description"/>?????????????????</p>??
  42. ????????????</td>??????????????<td?width="10%"?align="right"?class="serverbydomain_row">??
  43. ???????????????<p>????????????????????<a?href="delete?objectname={$objectname}"?mce_href="delete?objectname={$objectname}">??
  44. ?????????????????????<xsl:call-template?name="str">??????????????????????????<xsl:with-param?name="id">serverbydomain.mbean.unregister</xsl:with-param>??
  45. ?????????????????????</xsl:call-template>????????????????????</a>??
  46. ???????????????</p>??????????????</td>??
  47. ?????????</tr>????????</xsl:for-each>??
  48. ???</xsl:template>????
  49. ???<!--?Main?template?-->?????<xsl:template?match="Server">??
  50. ??????<html>???????????<xsl:call-template?name="head"/>??
  51. ?????????<body>??????????????<table?width="100%"?cellpadding="0"?cellspacing="0"?border="0">??
  52. ???????????????<tr?width="100%">????????????????????<td>??
  53. ?????????????????????<xsl:call-template?name="toprow"/>???????????????????????<xsl:call-template?name="tabs">??
  54. ????????????????????????<xsl:with-param?name="selection">server</xsl:with-param>???????????????????????</xsl:call-template>??
  55. ?????????????????????<xsl:variable?name="query">??????????????????????????<xsl:call-template?name="str">??
  56. ???????????????????????????<xsl:with-param?name="id">serverbydomain.server.query</xsl:with-param>??????????????????????????</xsl:call-template>??
  57. ?????????????????????</xsl:variable>???????????????????????<table?width="100%"?cellpadding="0"?cellspacing="0"?border="0">??
  58. ??????????????????????????<tr>??
  59. ???????????????????????????<td?class="page_title">????????????????????????????????<xsl:call-template?name="str">??
  60. ?????????????????????????????????<xsl:with-param?name="id">serverbydomain.server.title</xsl:with-param>????????????????????????????????</xsl:call-template>??
  61. ???????????????????????????</td>?????????????????????????????<form?action="serverbydomain">??
  62. ??????????????????????????????<td?align="right"?class="page_title">???????????????????????????????????<xsl:call-template?name="str">??
  63. ????????????????????????????????????<xsl:with-param?name="id">serverbydomain.server.filter</xsl:with-param>???????????????????????????????????</xsl:call-template>??
  64. ?????????????????????????????????<input?type="text"?name="querynames"?value="*:*"/>???????????????????????????????????<input?type="submit"?value="{$query}"/>??
  65. ??????????????????????????????</td>?????????????????????????????</form>??
  66. ????????????????????????</tr>???????????????????????</table>??
  67. ?????????????????????<table?width="100%"?cellpadding="0"?cellspacing="0"?border="0">??????????????????????????<xsl:call-template?name="domain"/>??
  68. ????????????????????????<xsl:call-template?name="error"/>???????????????????????</table>??
  69. ?????????????????????<xsl:call-template?name="bottom"/>????????????????????</td>??
  70. ???????????????</tr>??????????????</table>??
  71. ?????????</body>????????</html>??
  72. ???</xsl:template>??</xsl:stylesheet>??

Spring配置中通过实例化一个HttpAdaptor,注册到MBeanServer中,实现基于HTTP协议远程访问管理和监控。org.shirdrn.jmx.mx4j.MyConfiguration我们定义的一个MBean,也注册到MBean Server中,实现JMX的管理与监控,代码如下所示:

view plain
  1. package?org.shirdrn.jmx.mx4j;????
  2. public?class?MyConfiguration?{??????private?long?id?=?System.currentTimeMillis();??
  3. ????private?String?name;??????public?MyConfiguration()?{??
  4. ????????super();??????}??
  5. ????public?MyConfiguration(long?id,?String?name)?{??????????super();??
  6. ????????this.id?=?id;??????????this.name?=?name;??
  7. ????}??????public?long?getId()?{??
  8. ????????return?id;??????}??
  9. ????public?void?setId(long?id)?{??????????this.id?=?id;??
  10. ????}??????public?String?getName()?{??
  11. ????????return?name;??????}??
  12. ????public?void?setName(String?name)?{??????????//?通过JMX管理调用时,更新id的值??
  13. ????????this.id?=?System.currentTimeMillis();??????????this.name?=?name;??
  14. ????}??????public?String?show()?{??
  15. ????????StringBuffer?sb?=?new?StringBuffer().append("id=").append(id).append(??????????????????",?name=").append(name);??
  16. ????????System.out.println("show()="?+?sb.toString());??????????return?sb.toString();??
  17. ????}??}??

但是,Spring配置中的org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler对MBean暴露的操作进行了限制,主要是通过我们定义的接口org.shirdrn.jmx.mx4j.SelectedMethodsInterface来指定需要将MBean的哪些内容暴露给JMX管理,接口如下所示:

view plain
  1. package?org.shirdrn.jmx.mx4j;????
  2. public?interface?SelectedMethodsInterface?{????????public?long?getId();????
  3. ????public?void?setName(String?name);??????public?String?getName();??
  4. ????public?void?show();????}??

最后,我们可以初始化Spring的IOC容器,启动MX4J的HttpAdaptor服务,实现通过Web控制台的JMX管理,代码如下所示:

view plain
  1. package?org.shirdrn.jmx.mx4j;????
  2. import?java.io.IOException;??import?javax.management.MalformedObjectNameException;??
  3. import?mx4j.tools.adaptor.http.HttpAdaptor;??import?org.springframework.context.ApplicationContext;??
  4. import?org.springframework.context.support.ClassPathXmlApplicationContext;????
  5. public?class?JMXTest?{??????public?static?void?main(String[]?args)?throws?IOException,??
  6. ????????????MalformedObjectNameException,?Exception?{??????????ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext(??
  7. ????????????????new?String[]?{?"org/shirdrn/jmx/mx4j/applicationContext.xml"?});??????????HttpAdaptor?httpAdaptor?=?(HttpAdaptor)?ctx.getBean("httpAdaptor");??
  8. ????????httpAdaptor.start();??????}??
  9. }??

启动成功后,可以通过浏览http://192.168.1.102:9988,可以看到我们注册的MBean,并对其进行管理和监控。

读书人网 >编程

热点推荐