列宿乃施于上荣兮 日月才经于柍桭

………… 白驹过隙 岁月如斯 梦萦回绕 心灵之声
posts - 57, comments - 8, trackbacks - 0, articles - 41
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Spring中JMX技术的应用

Posted on 2010-06-18 11:56 默认为零 阅读(2268) 评论(0)  编辑  收藏 所属分类: 技术
  JMX(Java Management Extensions)即Java管理扩展,这是一种动态管理对象及属性的集成框架。JMX增强了系统的可配性,在不对该系统进行重启的情况下,修改相关的MBean属性值即可生效,例如日志信息级别的配置等基础数据的配置,形成动态效果。
  简单了解下相关的概念:
  MBean是Managed Bean的简称,在JMX中MBean代表一个被管理的资源实例。
  MBeanServer是MBean的容器,JMX规范中MBeanServer对外提供了灵活的注册和访问MBean的机制。

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

  这里举个例子简单介绍下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)通知和日志功能
  能自动发出属性变化通知,并能记录每一个发出的通知等。

只有注册用户登录后才能发表评论。


网站导航: