Spring与MX4J集成实现JMX管理

来源:互联网 发布:美国大学不要面试知乎 编辑:程序博客网 时间:2024/05/19 03:30

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,并对其进行管理和监控。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝被投诉侵权怎么办 电脑wifi链接不见了怎么办 无线设备坏了怎么办 电脑网页默认了怎么办 淘宝商家停止服务怎么办? 淘宝商家停止了怎么办 做淘宝不会美工怎么办 做客服打字慢怎么办 淘宝客服学不会怎么办 代购不给退货怎么办 淘宝不能发照片怎么办 兼职刷手被骗怎么办 淘宝店商品被降权怎么办 淘宝宝贝被降权了怎么办 淘宝违规降权怎么办 淘宝商品降权怎么办 公司不想要了怎么办 派派被客服禁言怎么办 淘宝收款不发货怎么办 新品标签没了怎么办 商家签收不退款怎么办 微信号存在风险怎么办 建网站不会管理怎么办 淘宝代销厂家发错货卖家怎么办 来分期退货退款怎么办 淘宝售后不退货怎么办 手机淘宝不退货怎么办 淘宝店不肯退款怎么办 退货快递丢件怎么办 淘宝客服不退款怎么办 淘宝被拉进黑名单怎么办 被买家举报假货怎么办 淘宝店售假3次怎么办 支付宝被骗200怎么办 淘宝被同行投诉怎么办 淘宝同行恶意投诉怎么办 淘宝被恶意举报怎么办 买到假的gucci包怎么办 淘宝买家退假货怎么办 淘宝产品被投诉怎么办 淘宝店铺被盗了怎么办