Spring与MX4J集成实现JMX管理

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

  • Spring 2.5
  • MX4J 3.0.2

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

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

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

[xhtml]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.   
  6.     <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"  
  7.         depends-on="mbeanServer">  
  8.         <property name="beans">  
  9.             <map>  
  10.                 <entry key="CONFIG.SHIRDRN.ORG:name=config" value-ref="config" />  
  11.                 <entry key="MX4J.SOURCEFORGE.COM:name=httpAdaptor" value-ref="httpAdaptor" />  
  12.                 <!-- 
  13.                 <entry key="jdmk.sun.com:name=adaptorServer" value-ref="adaptorServer" /> 
  14.                 -->  
  15.             </map>  
  16.         </property>  
  17.         <property name="server" ref="mbeanServer" />  
  18.         <property name="assembler">  
  19.             <ref bean="assembler" />  
  20.         </property>  
  21.     </bean>  
  22.     <bean id="assembler"  
  23.         class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">  
  24.         <property name="managedInterfaces">  
  25.             <list>  
  26.                 <value>org.shirdrn.jmx.mx4j.SelectedMethodsInterface</value>  
  27.             </list>  
  28.         </property>  
  29.     </bean>  
  30.     <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean" />  
  31.     <bean id="httpAdaptor" class="mx4j.tools.adaptor.http.HttpAdaptor">  
  32.         <property name="processor">  
  33.             <ref bean="xsltProcessor" />  
  34.         </property>  
  35.         <property name="host">  
  36.             <value>192.168.1.102</value>  
  37.         </property>  
  38.         <property name="port" value="9988" />  
  39.     </bean>  
  40.     <bean id="xsltProcessor" class="mx4j.tools.adaptor.http.XSLTProcessor" />  
  41.     <bean id="config" class="org.shirdrn.jmx.mx4j.MyConfiguration" />  
  42.       
  43.     <!--  
  44.     <bean id="adaptorServer" class="com.sun.jdmk.comm.HtmlAdaptorServer">  
  45.         <property name="port">  
  46.             <value>9999</value>  
  47.         </property>  
  48.     </bean>  
  49.     -->  
  50.   
  51. </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控制台首页模板:

[xhtml]  view plain  copy
  1. <?xml version="1.0"?>  
  2. <!--  
  3.  Copyright (C) The MX4J Contributors.  
  4.  All rights reserved.  
  5.   
  6.  This software is distributed under the terms of the MX4J License version 1.0.  
  7.  See the terms of the MX4J License in the documentation provided with this software.  
  8.   
  9.  Author: Carlos Quiroz (tibu@users.sourceforge.net)  
  10.  Revision: $Revision: 1.2 $  
  11.                                                                                                                                                     -->  
  12. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  13.    <xsl:output method="html" indent="yes" encoding="ISO-8859-1"/>  
  14.    <xsl:include href="common.xsl" mce_href="common.xsl"/>  
  15.    <xsl:include href="xalan-ext.xsl" mce_href="xalan-ext.xsl"/>  
  16.   
  17.    <xsl:param name="html.stylesheet">stylesheet.css</xsl:param>  
  18.    <xsl:param name="html.stylesheet.type">text/css</xsl:param>  
  19.    <xsl:param name="head.title">serverbydomain.title</xsl:param>  
  20.   
  21.    <!-- Invoked when a query error is produced -->  
  22.    <xsl:template match="Domain" name="error">  
  23.       <xsl:for-each select="Exception">  
  24.          <tr>  
  25.             <td class="serverbydomain_domainline" colspan="5">  
  26.                <xsl:call-template name="str">  
  27.                   <xsl:with-param name="id">serverbydomain.error.query</xsl:with-param>  
  28.                   <xsl:with-param name="p0">  
  29.                      <xsl:value-of select="@errorMsg"/>  
  30.                   </xsl:with-param>  
  31.                </xsl:call-template>  
  32.             </td>  
  33.          </tr>  
  34.       </xsl:for-each>  
  35.    </xsl:template>  
  36.   
  37.    <!-- Invoked to display each domain -->  
  38.    <xsl:template match="Domain" name="domain">  
  39.       <xsl:for-each select="Domain">  
  40.          <xsl:sort data-type="text" order="ascending" select="@name"/>  
  41.          <tr>  
  42.             <td class="serverbydomain_domainline" colspan="5">  
  43.                <xsl:call-template name="str">  
  44.                   <xsl:with-param name="id">serverbydomain.domain.label</xsl:with-param>  
  45.                   <xsl:with-param name="p0">  
  46.                      <xsl:value-of select="@name"/>  
  47.                   </xsl:with-param>  
  48.                </xsl:call-template>  
  49.             </td>  
  50.             <xsl:call-template name="mbean"/>  
  51.          </tr>  
  52.       </xsl:for-each>  
  53.    </xsl:template>  
  54.   
  55.    <!-- invoked for each mbean -->  
  56.    <xsl:template match="MBean" name="mbean">  
  57.       <xsl:for-each select="MBean">  
  58.          <xsl:sort data-type="text" order="ascending" select="@objectname"/>  
  59.          <xsl:variable name="classtype">  
  60.             <xsl:if test="(position() mod 2)=1">darkline</xsl:if>  
  61.             <xsl:if test="(position() mod 2)=0">clearline</xsl:if>  
  62.          </xsl:variable>  
  63.          <xsl:variable name="objectname">  
  64.             <xsl:call-template name="uri-encode">  
  65.                <xsl:with-param name="uri" select="@objectname"/>  
  66.             </xsl:call-template>  
  67.          </xsl:variable>  
  68.          <tr class="{$classtype}" width="100%">  
  69.             <td width="35%" align="left" class="serverbydomain_row">  
  70.                <a href="mbean?objectname={$objectname}" mce_href="mbean?objectname={$objectname}">  
  71.                   <xsl:value-of select="@objectname"/>  
  72.                </a>  
  73.             </td>  
  74.             <td width="20%" align="left" class="serverbydomain_row">  
  75.                <p>  
  76.                   <xsl:value-of select="@classname"/>  
  77.                </p>  
  78.             </td>  
  79.             <td width="35%" align="left" class="serverbydomain_row">  
  80.                <p>  
  81.                   <xsl:value-of select="@description"/>  
  82.                </p>  
  83.             </td>  
  84.             <td width="10%" align="right" class="serverbydomain_row">  
  85.                <p>  
  86.                   <a href="delete?objectname={$objectname}" mce_href="delete?objectname={$objectname}">  
  87.                      <xsl:call-template name="str">  
  88.                         <xsl:with-param name="id">serverbydomain.mbean.unregister</xsl:with-param>  
  89.                      </xsl:call-template>  
  90.                   </a>  
  91.                </p>  
  92.             </td>  
  93.          </tr>  
  94.       </xsl:for-each>  
  95.    </xsl:template>  
  96.   
  97.    <!-- Main template -->  
  98.    <xsl:template match="Server">  
  99.       <html>  
  100.          <xsl:call-template name="head"/>  
  101.          <body>  
  102.             <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  103.                <tr width="100%">  
  104.                   <td>  
  105.                      <xsl:call-template name="toprow"/>  
  106.                      <xsl:call-template name="tabs">  
  107.                         <xsl:with-param name="selection">server</xsl:with-param>  
  108.                      </xsl:call-template>  
  109.                      <xsl:variable name="query">  
  110.                         <xsl:call-template name="str">  
  111.                            <xsl:with-param name="id">serverbydomain.server.query</xsl:with-param>  
  112.                         </xsl:call-template>  
  113.                      </xsl:variable>  
  114.                      <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  115.   
  116.                         <tr>  
  117.                            <td class="page_title">  
  118.                               <xsl:call-template name="str">  
  119.                                  <xsl:with-param name="id">serverbydomain.server.title</xsl:with-param>  
  120.                               </xsl:call-template>  
  121.                            </td>  
  122.                            <form action="serverbydomain">  
  123.                               <td align="right" class="page_title">  
  124.                                  <xsl:call-template name="str">  
  125.                                     <xsl:with-param name="id">serverbydomain.server.filter</xsl:with-param>  
  126.                                  </xsl:call-template>  
  127.                                  <input type="text" name="querynames" value="*:*"/>  
  128.                                  <input type="submit" value="{$query}"/>  
  129.                               </td>  
  130.                            </form>  
  131.                         </tr>  
  132.                      </table>  
  133.                      <table width="100%" cellpadding="0" cellspacing="0" border="0">  
  134.                         <xsl:call-template name="domain"/>  
  135.                         <xsl:call-template name="error"/>  
  136.                      </table>  
  137.                      <xsl:call-template name="bottom"/>  
  138.                   </td>  
  139.                </tr>  
  140.             </table>  
  141.          </body>  
  142.       </html>  
  143.    </xsl:template>  
  144. </xsl:stylesheet>  

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

[java]  view plain  copy
  1. package org.shirdrn.jmx.mx4j;  
  2.   
  3. public class MyConfiguration {  
  4.     private long id = System.currentTimeMillis();  
  5.     private String name;  
  6.     public MyConfiguration() {  
  7.         super();  
  8.     }  
  9.     public MyConfiguration(long id, String name) {  
  10.         super();  
  11.         this.id = id;  
  12.         this.name = name;  
  13.     }  
  14.     public long getId() {  
  15.         return id;  
  16.     }  
  17.     public void setId(long id) {  
  18.         this.id = id;  
  19.     }  
  20.     public String getName() {  
  21.         return name;  
  22.     }  
  23.     public void setName(String name) {  
  24.         // 通过JMX管理调用时,更新id的值  
  25.         this.id = System.currentTimeMillis();  
  26.         this.name = name;  
  27.     }  
  28.     public String show() {  
  29.         StringBuffer sb = new StringBuffer().append("id=").append(id).append(  
  30.                 ", name=").append(name);  
  31.         System.out.println("show()=" + sb.toString());  
  32.         return sb.toString();  
  33.     }  
  34. }  

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

[java]  view plain  copy
  1. package org.shirdrn.jmx.mx4j;  
  2.   
  3. public interface SelectedMethodsInterface {    
  4.     public long getId();    
  5.     public void setName(String name);  
  6.     public String getName();  
  7.     public void show();    
  8. }  

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

[java]  view plain  copy
  1. package org.shirdrn.jmx.mx4j;  
  2.   
  3. import <a href="http://lib.csdn.net/base/17" class='replace_word' title="Java EE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.io.IOException;  
  4. import javax.management.MalformedObjectNameException;  
  5. import mx4j.tools.adaptor.http.HttpAdaptor;  
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  8.   
  9. public class JMXTest {  
  10.     public static void main(String[] args) throws IOException,  
  11.             MalformedObjectNameException, Exception {  
  12.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  13.                 new String[] { "org/shirdrn/jmx/mx4j/applicationContext.xml" });  
  14.         HttpAdaptor httpAdaptor = (HttpAdaptor) ctx.getBean("httpAdaptor");  
  15.         httpAdaptor.start();  
  16.     }  
  17. }  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值