Spring中JMX技术的应用

  JMX(Java Management Extensions)即Java管理扩展,这是一种动态管理对象及属性的集成框架。JMX增强了系统的可配性,在不对该系统进行重启的情况下,修改相关的MBean属性值即可生效,例如日志信息级别的配置等基础数据的配置,形成动态效果。
  简单了解下相关的概念:
  MBean是Managed Bean的简称,在JMX中MBean代表一个被管理的资源实例。
  MBeanServer是MBean的容器,JMX规范中MBeanServer对外提供了灵活的注册和访问MBean的机制。

  JMX体系架构可以理解为三个层次:设备层、代理层和分布层。设备层定义了需要管理的信息模型,也就是MBean,包括他的接口定义和相应开发规范等等。代理层核心是一个MBeanServer,它用来管理相应的信息模型,并且为访问者提供了访问接口。分布层定义了一系列用来访问代理层的接口和组件,供管理者使用。(见下图)
Spring中JMX技术的应用_第1张图片

  这里举个例子简单介绍下Spring框架中JMX技术的集成应用:
  1.定义MBean Interface ParameterMBean
package  com.huateng.mbean;

public   interface  ParameterMBean  {

    
/** *//** 默认的线程池规模 */
    
int THREAD_POOL_SIZE = 20;

    
void setThreadPoolSize(int size);

    
int getThreadPoolSize();
}

  2.实现ParameterMBean
package  com.huateng.mbean;

public   class  Parameter  implements  ParameterMBean  {

    
int threadPoolSize = THREAD_POOL_SIZE;

    
/**//*
     * (non-Javadoc)
     * @see com.huateng.mbean.ParameterMBean#getThreadPoolSize()
     
*/

    @Override
    
public int getThreadPoolSize() {
        
return threadPoolSize;
    }


    
/**//*
     * (non-Javadoc)
     * @see com.huateng.mbean.ParameterMBean#setThreadPoolSize(int)
     
*/

    @Override
    
public void setThreadPoolSize(int size) {
        
this.threadPoolSize = size;
    }


}

  3.在Spring applicationContext.xml配置中定义Parameter
<? xml version="1.0" encoding="UTF-8" ?>
< beans  xmlns ="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >

    
< bean  id ="log4j"  class ="org.apache.log4j.jmx.HierarchyDynamicMBean"   />

    
< bean  name ="log4j:logger=com.huateng"
        class
="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        depends-on
="jmxExporter" >
        
< property  name ="targetObject"  ref ="log4j"   />
        
< property  name ="targetMethod"  value ="addLoggerMBean"   />
        
< property  name ="arguments"  value ="com.huateng"   />
    
</ bean >

    
< bean  id ="htmlAdaptor"  class ="com.sun.jdmk.comm.HtmlAdaptorServer"
        init-method
="start" >
        
< constructor-arg  index ="0"  value ="9070"   />
        
< constructor-arg  index ="1" >
            
< bean  id ="authInfo"  class ="com.sun.jdmk.comm.AuthInfo" >
                
< property  name ="login"  value ="admin"   />
                
< property  name ="password"  value ="admin"   />
            
</ bean >
        
</ constructor-arg >
    
</ bean >

    
< bean  id ="mbeanServer"
        class
="org.springframework.jmx.support.MBeanServerFactoryBean" >
        
< property  name ="locateExistingServerIfPossible"  value ="false"   />
        
< property  name ="defaultDomain"  value ="GSP"   />
    
</ bean >

    
< bean  id ="jmxExporter"
        class
="org.springframework.jmx.export.MBeanExporter" >
        
< property  name ="beans" >
            
< map >
                
< entry  key ="log4j:hiearchy=default" >
                    
< ref  local ="log4j"   />
                
</ entry >
                
< entry  key ="com.huateng.gsp:name=htmlAdaptor" >
                    
< ref  local ="htmlAdaptor"   />
                
</ entry >
                
< entry  key ="com.huateng.gsp:name=hibernate" >
                    
< ref  local ="hibernate"   />
                
</ entry >
                
< entry  key ="com.huateng.gsp:name=statistics" >
                    
< ref  local ="statistics"   />
                
</ entry >
                
< entry  key ="com.huateng.gsp:name=parameter" >
                    
< ref  local ="parameter"   />
                
</ entry >
            
</ map >
        
</ property >
        
< property  name ="server" >
            
< ref  local ="mbeanServer"   />
        
</ property >
    
</ bean >

    
< bean  id ="parameter"  class ="com.huateng.mbean.Parameter"   />
    
< bean  id ="hibernate"  class ="org.hibernate.jmx.HibernateService"   />
    
< bean  id ="statistics"  class ="org.hibernate.jmx.StatisticsService"   />
</ beans >
  好了Spring应用启动后在浏览器中输入:
         http://localhost:9070  (admin/admin)
  是不是可以看到刚才定义的Parameter对象属性了。

  简单说明一下:
  1)HtmlAdaptorServer是SUN JDMK工具包中提供的JMX Adaptor,通过它实现对指定MBeanServer中MBean对象的输出和访问控制。
  2)在这个例子中顺便把Hibernate引擎所内置的两个MBean对象给输出了,HibernateService和StatisticsService。
  3)定义MBeanServer的时候,locateExistingServerIfPossible标志为true的时候表示在应用所在容器中查找已有的MBeanServer,如果有存在则将当前MBean注册其中,其实就是复用MBeanServer。比如在Tomcat和Websphere中都会将容器内置的MBeanServer(包括它内置和Parameter等MBean)在Adaptor中输出。

  此外JMX规范中提供了其它非常实用的特性比如:
  1)持久性 
  定义了持久机制,可以利用Java的序列化或JDBC来存储模型MBean的状态。
  2)通知和日志功能
  能自动发出属性变化通知,并能记录每一个发出的通知等。

你可能感兴趣的:(Spring中JMX技术的应用)