列宿乃施于上榮兮 日月才經于柍桭

          ………… 白駒過隙 歲月如斯 夢縈回繞 心靈之聲
          posts - 57, comments - 8, trackbacks - 0, articles - 41
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Spring中JMX技術的應用

          Posted on 2010-06-18 11:56 默認為零 閱讀(2297) 評論(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)通知和日志功能
            能自動發出屬性變化通知,并能記錄每一個發出的通知等。

          主站蜘蛛池模板: 巩义市| 东乡族自治县| 于都县| 永福县| 健康| 北京市| 胶南市| 逊克县| 乐清市| 泾阳县| 天柱县| 上饶市| 突泉县| 萨嘎县| 铅山县| 罗平县| 宜春市| 临沧市| 呼玛县| 中江县| 尼勒克县| 乐山市| 新竹县| 白山市| 胶南市| 新丰县| 井研县| 龙川县| 新津县| 博乐市| 大理市| 祁连县| 东方市| 瓮安县| 宜章县| 东兴市| 孙吴县| 夏河县| 富顺县| 开原市| 云南省|