钟无艳:Spring与MX4J集成实现JMX管理

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 23:21:10
MX4J是一个开源JMX管理框架,支持JSR3 (JMX) 和JSR160 (JMX RemoteAPI)。通过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的完整配置,如下所示:

view plain
  1.   
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  3.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  4.   
  5.     
  6.         depends-on="mbeanServer">  
  7.           
  8.               
  9.                   
  10.                   
  11.                   
  12.               
  13.           
  14.           
  15.           
  16.               
  17.           
  18.       
  19.     
  20.         class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">  
  21.           
  22.               
  23.                 org.shirdrn.jmx.mx4j.SelectedMethodsInterface  
  24.               
  25.           
  26.       
  27.       
  28.       
  29.           
  30.               
  31.           
  32.           
  33.             172.20.9.23  
  34.           
  35.           
  36.       
  37.       
  38.       
  39.       
  40.       
  41.   
  42.    

上面配置中,比较核心的是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.   
  2.   
  3.   
  4.      
  5.      
  6.      
  7.   
  8.    stylesheet.css  
  9.    text/css  
  10.    serverbydomain.title  
  11.   
  12.      
  13.      
  14.         
  15.            
  16.               
  17.                  
  18.                   serverbydomain.error.query  
  19.                     
  20.                        
  21.                     
  22.                  
  23.               
  24.            
  25.         
  26.      
  27.   
  28.      
  29.      
  30.         
  31.            
  32.            
  33.               
  34.                  
  35.                   serverbydomain.domain.label  
  36.                     
  37.                        
  38.                     
  39.                  
  40.               
  41.               
  42.            
  43.         
  44.      
  45.   
  46.      
  47.      
  48.         
  49.            
  50.            
  51.             darkline  
  52.             clearline  
  53.            
  54.            
  55.               
  56.                  
  57.               
  58.            
  59.            
  60.               
  61.                  
  62.                     
  63.                  
  64.               
  65.               
  66.                

      

  67.                     
  68.                

      
  69.               
  70.               
  71.                

      

  72.                     
  73.                

      
  74.               
  75.               
  76.                

      

  77.                     
  78.                        
  79.                         serverbydomain.mbean.unregister  
  80.                        
  81.                     
  82.                

      
  83.               
  84.            
  85.         
  86.      
  87.   
  88.      
  89.      
  90.         
  91.            
  92.            
  93.               
  94.                  
  95.                     
  96.                        
  97.                        
  98.                         server  
  99.                        
  100.                        
  101.                           
  102.                            serverbydomain.server.query  
  103.                           
  104.                        
  105.                        
  106.   
  107.                           
  108.                              
  109.                                 
  110.                                  serverbydomain.server.title  
  111.                                 
  112.                              
  113.                              
  114.                                 
  115.                                    
  116.                                     serverbydomain.server.filter  
  117.                                    
  118.                                    
  119.                                    
  120.                                 
  121.                              
  122.                           
  123.                        
  124.                        
  125.                           
  126.                           
  127.                        
  128.                        
  129.                     
  130.                  
  131.               
  132.            
  133.         
  134.      
  135.   

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

view plain
  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管理,接口如下所示:

view plain
  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管理,代码如下所示:

view plain
  1. package org.shirdrn.jmx.mx4j;  
  2.   
  3. import java.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,并对其进行管理和监控。