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
2.实现ParameterMBean
3.在Spring applicationContext.xml配置中定义Parameter
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)通知和日志功能
能自动发出属性变化通知,并能记录每一个发出的通知等。
简单了解下相关的概念:
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();
}
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;
}
}
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应用启动后在浏览器中输入:
< 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 >
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)通知和日志功能
能自动发出属性变化通知,并能记录每一个发出的通知等。