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
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











2.實現ParameterMBean

























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)通知和日志功能
能自動發出屬性變化通知,并能記錄每一個發出的通知等。