Spring的JMX支持

19.1. 簡介
Spring的JMX支持所提供的特性使你容易而又透明地將你的Spring應用集成進一個JMX架構中。Spring JMX明確提供了4個核心特性:
  • 自動註冊任一個Spring bean爲JMX Mbean
    靈活的操縱你的bean管理接口的機制
    通過遠程,JSR-160連接器對外發布Mbeans
    對本地和遠程Mbean資源的簡單代理

這些特性被設計用來使你的應用組件在不必耦合到Spring或JMX接口或類的情況下就可以工作。實際上,你的大部分應用類可以在不需要知道Spring或JMX的情況下使用Spring的JMX特性。
19.2. 導出你的Bean到JMX
Spring JMX框架中的核心類是MbeanExporter. 該類負責獲取你的Spring beans並在JMX MbeanServer中註冊它們。例如,假設有如下的簡單bean類:
代碼:
package org.springframework.jmx;
public class JmxTestBean implements IJmxTestBean
{
    private String name;
    private int age;
    private boolean isSuperman;
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getName()
    {
        return name;
    }
    public int add(int x, int y)
    {
        return x + y;
    }
    public void dontExposeMe()
    {
        throw new RuntimeException();
    }
}

要將該bean中的屬性和方法公佈爲JMX Mbean中的參數和操作,你只要在配置文件 中簡單的配置MbeanExporter類並傳入如下的bean:
代碼:
<beans>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
      <map>
        <entry key="bean:name=testBean1" value-ref="testBean"/>
      </map>
    </property>
  </bean>
  <bean id="testBean" class="org.springframework.jmx.JmxTestBean">
    <property name="name" value="TEST"/>
    <property name="age" value="100"/>
  </bean>
</beans>

這裏,最重要的是定義exporter bean. beans屬性被用來通知MbeanExporter你有那些beans將被髮布到JMX MbeanServer. beans屬性是Map類型,因而你能使用<map>和<entry>標記來配置要發佈的beans. 在默認的配置中,Map中條目的鍵值被用作該條目中value所指bean的ObjectName. 這個動作可以按照19.4節"控制你的beans的ObjectName"的描述進行更改.
用這個配置,testBean在ObjectName bean:name=testBean1下被髮布爲JMX Mbean,。所有的公共屬性被公佈爲參數而所有公共方法(除去在Object中定義的那些)被公佈爲操作。
19.2.1. 創建一個MBeanServer
如上所示的配置中假定該應用運行在一個有且只有一個MbeanServer正在運行的環境中。在這種情況下,Spring將定位正在運行的MbeanServer並註冊你的beans到其中。這在你的應用運行在一個擁有自己的MbeanServer的容器內如Tomcat或者IBM WebSphere時很有用。
然而,這個方法無法用於獨立環境中,或者當它運行在一個沒有提供MbeanServer的容器時。爲了克服這種困難,你可以通過在配置中聲明添加一個org.springframework.jmx. support.MbeanServerFactoryBean的實例來創建MbeanServer的實例。通過設置MbeanExporter的server屬性爲MbeanServerFactoryBean,你同樣可以確保這個MbeanServer被使用。如下所示:
代碼:
<beans>
  <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
      <map>
        <entry key="bean:name=testBean1" value-ref="testBean"/>
      </map>
    </property>
    <property name="server" ref="mbeanServer"/>
  </bean>
  <bean id="testBean" class="org.springframework.jmx.JmxTestBean">
    <property name="name" value="TEST"/>
    <property name="age" value="100"/>
  </bean>
</beans>

這裏一個MbeanServer的實例被創建並通過service屬性提供給MbeanExporter,當你提供你自己的MbeanServer時,MbeanExporter將不再嘗試去訪問正在運行的MbeanServer。爲了讓它正常工作,在你的classpath下必須有一個JMX的實現。
19.2.2. Mbean的延遲加載
如果你配置了一個bean爲MbeanExporter,還可以配置它爲延遲加載,這時MbeanExporter將不會違反這個約定並避免實例化這個bean. 作爲代替,它將爲MbeanServer註冊一個代理並推遲從BeanFactory獲取該bean直到該代理進行第一次調用。
19.2.3. 自動註冊MBeans
任何通過MbeanExporter發佈的beans和按照現在的樣子在MbeanServer中定義的有效Mbeans並不需要Spring進一步介入。通過設置autodetect屬性爲true,Mbeans能被MBeanExporter自動探測到。
代碼:
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
  <property name="autodetect" value="true"/>
</bean>
<bean name="spring:mbean=true" class="org.springframework.jmx.export.TestDynamicMBean"/>

這裏命名爲spring:mbean=true的bean已經是一個有效的JMX Mbean並自動會被Spring註冊。通常,自動探測到的bean用於JMX註冊時用它們的bean名字作爲ObjectName。這個動作可以按照18.4節"控制你的beans的ObjectName"的描述進行更改.
19.3. 控制你的bean的管理接口
在前面的例子中,你只能通過你的bean的管理接口對所有暴露出來的公共屬性和方法進行很少的控制。爲解決這個問題,Spring JMX提供一個全面又可擴展的機制來控制你的bean的管理接口。
19.3.1. MbeanInfoAssembler接口
在後臺,MbeanExporter委派一個org.springframework.jmx.export. assembler.MbeanInfoAssembler接口的實現來負責爲每個bean定義發佈出來的管理接口。默認的實現org.springframework.jmx.export.assembler. SimpleReflectiveMBeanInfoAssembler,只是簡單的定義一個接口發佈所有的公共參數和方法,正如你在前面的例子中看到的一樣。Spring爲MbeanInfoAssembler接口提供兩個額外的實現,允許你通過源碼級元數據或任意的接口來控制管理接口。
19.3.2. 使用源碼級元數據
利用MetadataMBeanInfoAssembler,你能使用源碼級元數據爲你的bean定義管理接口。元數據的讀取被封裝在org.springframework.jmx.export.metadata. JmxAttributeSource接口。在該單元外,Spring JMX爲這個接口提供兩種支持:支持普通參數的org.springframework.jmx.export.metadata. AttributesJmxAttributeSource和支持JDK5.0註解的org.springframework. jmx.export.annotation.AnnotationJmxAttributeSource。MetadataMBeanInfoAssembler必須要配置一個JmxAttributeSource的實現才能正確運行。在這個例子中,我們將使用普通參數元數據的方法。
要標示一個bean發佈給JMX,你應當用ManagedResource參數來註解這個bean類。在使用普通參數元數據方法的場合中,這個類可以在org.springframework.jmx.metadata包中找到。每個要發佈爲操作的方法應當用ManagedOperation屬性來標示,每個要發佈的參數應當用ManagedAttribute參數來標示。當標示參數時,你可以省略getter或setter來分別創建一個只寫或只讀的參數。
下面的例子顯示了用普通參數元數據標示前面看到的JmxTestBean類:
代碼:
package org.springframework.jmx;
/**
 * @@org.springframework.jmx.export.metadata.ManagedResource
 * (description="My Managed Bean", objectName="spring:bean=test",
 * log=true, logFile="jmx.log", currencyTimeLimit=15, persistPolicy="OnUpdate",
 * persistPeriod=200, persistLocation="foo", persistName="bar")
 *
 */
public class JmxTestBean implements IJmxTestBean
{
    private String name;
    private int age;
    /**
     * @@org.springframework.jmx.export.metadata.ManagedAttribute
     * (description="The Age Attribute", currencyTimeLimit=15)
     */
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    /**
     * @@org.springframework.jmx.export.metadata.ManagedAttribute
     * (description="The Name Attribute", currencyTimeLimit=20,
     * defaultValue="bar", persistPolicy="OnUpdate")
     */
    public void setName(String name)
    {
        this.name = name;
    }
    /**
     * @@org.springframework.jmx.export.metadata.ManagedAttribute
     * (defaultValue="foo", persistPeriod=300)
     */
    public String getName()
    {
        return name;
    }
    /**
     * @@org.springframework.jmx.export.metadata.ManagedOperation
     * (description="Add Two Numbers Together")
     */
    public int add(int x, int y)
    {
        return x + y;
    }
    public void dontExposeMe()
    {
        throw new RuntimeException();
    }
}

這裏你可以看到,JmxTestBean類被ManagedResource參數標示並且ManagedResource參數被配置到一個屬性集。這些屬性能被用於配置由MbeanExporter產生的Mbean的不同的切面,進一步的說明請參見19.3.4 "Source-Level Metadata Types".
你同樣注意到age和name屬性都用ManagedAttribute來標示,但是age屬性只標示了getter方法。這將使得這兩個屬性都作爲參數被包含在管理接口中,並且age參數是隻讀的。
最後,你會注意到add(int, int)方法用ManagedOperation參數來標示而dontExposeMe()方法沒有標示。這將使得當使用MetadataMBeanInfoAssembler時,管理接口中只包含一個操作add(int, int)。
下面的代碼展示瞭如何使用MetadataMBeanInfoAssembler來配置MbeanExporter:
代碼:
<beans>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
      <map>
        <entry key="bean:name=testBean1">
          <ref local="testBean"/>
        </entry>
      </map>
    </property>
    <property name="assembler">
      <ref local="assembler"/>
    </property>
  </bean>
  <bean id="testBean" class="org.springframework.jmx.JmxTestBean">
    <property name="name">
      <value>TEST</value>
    </property>
    <property name="age">
      <value>100</value>
    </property>
  </bean>
  <bean id="attributeSource"
    class="org.springframework.jmx.export.metadata.AttributesJmxAttributeSource">
    <property name="attributes">
      <bean class="org.springframework.metadata.commons.CommonsAttributes"/>
    </property>
  </bean>
  <bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
    <property name="attributeSource">
      <ref local="attributeSource"/>
    </property>
  </bean>
</beans>

這裏你可以看到,一個MetadataMBeanInfoAssembler bean設置了一個AttributesJmxAttributeSource的實例,並且通過assembler屬性傳遞到MbeanExporter中,這就是在你的Spring-exposed Mbeans中利用metadata-driven管理接口時所有的要求。
19.3.3. 使用JDK 5.0的註解
要在管理接口定義中使用JDK5.0的註解,Spring提供了一個註解集鏡像到Commons Attribute參數類和一個JMX的實現來支持JmxAttributeSource, AnnotationsJmxAttributeSource並允許MbeanInfoAssembler讀取它們。
下面的例子顯示了一個用JDK5.0註解定義管理接口的bean:
代碼:
package org.springframework.jmx;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedAttribute;
@ManagedResource(objectName="bean:name=testBean4",
description="My Managed Bean", log=true,
logFile="jmx.log", currencyTimeLimit=15,
persistPolicy="OnUpdate", persistPeriod=200,
persistLocation="foo", persistName="bar")
public class AnnotationTestBean implements IJmxTestBean
{
    private String name;
    private int age;
    @ManagedAttribute(description="The Age Attribute", currencyTimeLimit=15)
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
   
    @ManagedAttribute(description="The Name Attribute",
    currencyTimeLimit=20,
    defaultValue="bar",
    persistPolicy="OnUpdate")
    public void setName(String name)
    {
        this.name = name;
    }
    @ManagedAttribute(defaultValue="foo", persistPeriod=300)
    public String getName()
    {
        return name;
    }
    @ManagedOperation(description="Add Two Numbers Together")
    public int add(int x, int y)
    {
        return x + y;
    }
    public void dontExposeMe()
    {
        throw new RuntimeException();
    }
}

正如你所見,除了元數據定義的語法外只有很少的變動。這個方法在後臺啓動時會有一點緩慢,因爲要在類中使用Commons Attributes轉換JDK5.0的註解。不過,這僅僅是一次性的開銷並且JDK5.0的註解爲你帶來編譯時檢查的好處。
19.3.4. Source-Level Metadata Types
下面是Spring JMX中使用的源碼級元數據類型:
  • Purpose Commons AttributesAttribute JDK 5.0 Annotation Attribute / AnnotationType
    Mark all instances of a Class as JMX managed resources ManagedResource @ManagedResource Class
    Mark a method as a JMX operation ManagedOperation @ManagedOperation Method
    Mark a getter or setter as one half of a JMX attribute ManagedAttribute @ManagedAttribute Method (only getters and setters)
    Define descriptions for operation parameters ManagedOperationParameters @rManagedOperationParameter and@ManagedOperationParameters Method

Table 19.1. Source-Level Metadata Types

下面是源碼級元數據類型中使用的配置參數:
  • Parameter Description Applies to
    objectName Used by MetadataNamingStrategy to determine the ObjectName of a managed resource managed resource
    description Sets the friendly description of the resource, attribute or operation ManagedResource,ManagedAttribute,ManagedOperation,ManagedOperationParameter
    currencyTimeLimit Sets the value of the currencyTimeLimit descriptor field ManagedResource,ManagedAttribute
    defaultValue Sets the value of the defaultValue descriptor field ManagedAttribute
    log Sets the value of the log descriptor field ManagedResource
    logFile Sets the value of the logFile descriptor field ManagedResource
    persistPolicy Sets the value of the persistPolicy descriptor field ManagedResource
    persistPeriod Sets the value of the persistPeriod descriptor field ManagedResource
    persistLocation Sets the value of the persistLocation descriptor field ManagedResource
    persistName Sets the value of the persistName descriptor field ManagedResource
    name Sets the display name of an operation parameter ManagedOperationParameter
    index Sets the index of an operation parameter ManagedOperationParameter

Table 19.2. Source-Level Metadata Parameters
19.3.5. AutodetectCapableMBeanInfoAssembler接口
爲簡化配置甚至更多,Spring引入了AutodetectCapableMBeanInfoAssembler接口,它擴展了MbeanInfoAssembler接口以增加對自動檢測Mbean資源的支持。如果你配置MbeanExporter有一個AutodetectCapableMBeanInfoAssembler實例,它允許"選取"bean的內容發佈給JMX。
在該單元外,AutodetectCapableMBeanInfo接口的唯一實現是MetadataMBeanInfoAssembler,它將選擇包含使用ManagedResource參數標示的任何bean,在這種情況中默認的方法是使用bean name作爲Objectname,這將形成如下的配置:
代碼:
<beans>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="assembler" ref="assembler"/>
    <property name="autodetect" value="true"/>
  </bean>
  <bean id="bean:name=testBean1" class="org.springframework.jmx.JmxTestBean">
    <property name="name" value="TEST"/>
    <property name="age" value="100"/>
  </bean>
  <bean id="attributeSource"
    class="org.springframework.jmx.export.metadata.AttributesJmxAttributeSource"/>
  <bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
    <property name="attributeSource" ref="attributeSource"/>
  </bean>
</beans>

注意在這個配置中並沒有bean被傳入到MbeanExporter中,然而在用ManagedResource 標示後JmxTestBean還是會被註冊,MetadataMBeanInfoAssembler會檢測並選取它。這種方法唯一的問題是JmxTestBean的名字現在有了業務上的意義,你可以通過修改創建ObjectName的默認動作來解決這個問題,正如19.4節 "Controlling the ObjectNames for your Beans"中定義的一樣.
19.3.6. 使用Java接口定義管理接口
除MetadataMBeanInfoAssembler之外,Spring還包含了InterfaceBasedMBeanInfoAssembler,它允許你通過在接口中定義方法集的形式強制發佈方法和屬性。
儘管發佈Mbean的標準機制是使用接口和一個簡單的命名規則,InterfaceBasedMBeanInfoAssembler還是通過取消命名規則的需要擴展了這個功能,從而允許你使用多於一個的接口並且使你的bean不必實現Mbean接口。
設想用這個接口用來爲前面看到的JmxTestBean類定義管理接口:
代碼:
public interface IJmxTestBean
{
    public int add(int x, int y);
    public long myOperation();
    public int getAge();
    public void setAge(int age);
    public void setName(String name);
    public String getName();
}

這個接口定義了將要在JMX Mbean中被髮布爲操作和參數的方法和屬性。下面的代碼顯示了Spring JMX如何使用這個接口用作管理接口的定義:
代碼:
<beans>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
      <map>
        <entry key="bean:name=testBean5">
          <ref local="testBean"/>
        </entry>
      </map>
    </property>
    <property name="assembler">
      <bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">
        <property name="managedInterfaces">
          <value>org.springframework.jmx.IJmxTestBean</value>
        </property>
      </bean>
    </property>
  </bean>
  <bean id="testBean" class="org.springframework.jmx.JmxTestBean">
    <property name="name">
      <value>TEST</value>
    </property>
    <property name="age">
      <value>100</value>
    </property>
  </bean>
</beans>

這裏你可以看到InterfaceBasedMBeanInfoAssembler被配置爲使用IjmxTestBean接口去創建任何bean的管理接口。重要的是要明白通過InterfaceBasedMBeanInfoAssembler處理的beans沒必要去實現產生JMX管理接口的接口。
在上面的例子中,IjmxTestBean接口被用來爲所有接口構造所有的管理方法。在多數情況下,這並不是期望的動作,你可能想對不同的bean使用不同的接口,在這種情況下,你可能通過interfaceMappings屬性傳入一個properties給InterfaceBasedMBeanInfoAssembler,其中,每個條目的鍵值是bean的名字而每個條目的值是一個用於該bean的以逗號分隔的接口名清單。
如果沒有通過managedInterfaces或interfaceMappings屬性集指定管理接口,InterfaceBasedMBeanInfoAssembler將反射該bean並使用該bean實現的所有接口去創建管理接口。
19.3.7. 使用MethodNameBasedMBeanInfoAssembler
MethodNameBasedMBeanInfoAssembler允許你指定一個將要發佈爲JMX參數和操作的方法名列表,下面的代碼展示了一個配置的例子:
代碼:
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
  <property name="beans">
    <map>
    <entry key="bean:name=testBean5">
    <ref local="testBean"/>
    </entry>
    </map>
  </property>
  <property name="assembler">
    <bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
      <property name="managedMethods">
        <value>add,myOperation,getName,setName,getAge</value>
      </property>
    </bean>
  </property>
</bean>

這裏你可以看到方法add和myOperation將被公佈爲JMX的操作,getName、setName和getAge作爲適當的JMX參數。在上面的代碼中,方法映射被應用到要發佈到JMX的bean上。要控制基於bean by bean的方法發佈,使用MethodNameMBeanInfoAssembler的methodMappings屬性集來映射bean的名字到方法名列表。
19.4. 爲你的bean控制ObjectName
在後臺,MbeanExporter委派ObjectNamingStrategy的一個實現來獲取每個已註冊bean的ObjectName。默認的實現KeyNamingStrategy將使用beans Map的鍵值作爲ObjectName。另外,KeyNamingStrategy可以映射beans Map的鍵值到屬性文件的一個條目來分辨ObjectName。除KeyNamingStrategy之外,Spring提供兩個額外的ObjectNamingStrategy實現:IdentityNamingStrategy能基於bean的標記符來構造ObjectName而MetadataNamingStrategy使用源碼級元數據獲取ObjectName。
19.4.1. 從屬性文件讀取ObjectName
你可以配置你自己的KeyNamingStrategy實例並設置它從一個Properties實例讀取ObjectName而不是使用bean的鍵值。KeyNamingStrategy將試圖在Properties中用與bean的鍵值對應的鍵來查找一個條目。如果沒發現條目或Properties實例爲空將使用bean自身的鍵值。
下面的代碼顯示了一個配置KeyNamingStrategy的例子:
代碼:
<beans>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
      <map>
        <entry key="testBean" value-ref="testBean"/>
      </map>
    </property>
    <property name="namingStrategy" ref="namingStrategy"/>
  </bean>
  <bean id="testBean" class="org.springframework.jmx.JmxTestBean">
    <property name="name" value="TEST"/>
    <property name="age" value="100"/>
  </bean>
  <bean id="namingStrategy" class="org.springframework.jmx.export.naming.KeyNamingStrategy">
    <property name="mappings">
      <props>
        <prop key="testBean">bean:name=testBean1</prop>
      </props>
    </property>
    <property name="mappingLocations">
      <value>names1.properties,names2.properties</value>
    </property>
  </bean>
</beans>

這裏的KeyNamingStrategy實例中配置了一個Properties實例,該實例結合了由map屬性集定義的屬性實例和屬性文件路徑。在這個配置中,testBean設定ObjectName爲bean:name=testBean1,此後,它成爲Properties實例的一個條目並有一個鍵值對應到bean的鍵值。
如果在Properties實例中沒有發現該條目,bean的鍵值會被作爲ObjectName.
19.4.2. 使用MetadataNamingStrategy
MetadataNamingStrategy使用每個bean上ManagedResource參數的objectName屬性去創建ObjectName.下面的代碼展示了MetadataNamingStrategy的配置:
代碼:
<beans>
  <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
      <map>
        <entry key="testBean" value-ref="testBean"/>
      </map>
    </property>
    <property name="namingStrategy" ref="namingStrategy"/>
  </bean>
  <bean id="testBean" class="org.springframework.jmx.JmxTestBean">
    <property name="name" value="TEST"/>
    <property name="age" value="100"/>
  </bean>
  <bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
    <property name="attributeSource" ref="attributeSource"/>
  </bean>
  <bean id="attributeSource"
    class="org.springframework.jmx.export.metadata.AttributesJmxAttributeSource"/>
</beans>

19.5. 用JSR-160連接器發佈你的bean
爲進行遠程訪問,Spring JMX模塊在org.springframework.jmx.support包中提供了兩個FactoryBean的實現用於創建服務端和客戶端的連接器。
19.5.1. 服務端連接器
Spring JMX使用下面的配置創建、啓動和發佈一個JSR-160 JMXConnectorServer:
代碼:
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean"/>

通過默認的ConnectorServerFactoryBean創建一個JMXConnectorServer綁定到"service:jmx:jmxmp://localhost:9875"。ServerConnector從而在本機上通過JMXMP協議發佈本機的MbeanServer給客戶端。注意JMXMP協議在JSR160中標識爲可選的:當前重要的開源JMX實現MX4J和J2SE5.0所提供的實現都未支持JMXMP。
要指定其它的URL並在MbeanServer中註冊JMXConnectorServer本身,分別使用serviceUrl和objectName屬性:
代碼:
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean">
  <property name="objectName" value="connector:name=rmi"/>
  <property name="serviceUrl" value"service:jmx:rmi://localhost/jndi/rmi://localhost:1099/myconnector"/>
</bean>

如果設置了ObjectName屬性,Spring會自動隨着ObjectName下的MbeanServer註冊你的連接器。下面的例子顯示了當創建JMXConnector時傳遞到ConnectorServerFactoryBean的完整參數集:
代碼:
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean">
  <property name="objectName" value="connector:name=iiop"/>
  <property name="serviceUrl"
    value="service:jmx:iiop://localhost/jndi/iiop://localhost:900/myconnector"/>
  <property name="threaded" value="true"/>
  <property name="daemon" value="true"/>
  <property name="environment">
    <map>
      <entry key="someKey" value="someValue"/>
    </map>
  </property>
</bean>

進一步的信息請參考JavaDoc。環境變量的說明信息,也請參考JavaDoc
注意當使用一個RMI-based連接器時,你需要啓動lookup服務(tnameserv或rmiregistry)用來完成名稱註冊。如果你通過RMI使用Spring發佈遠程服務,Spring還要構造一個RMI註冊項。如果沒有,你可以容易地使用下面的配置項啓動一個註冊:
代碼:
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">  <property name="port" value="1099"/></bean>

19.5.2. 客戶端連接器
要創建一個到遠程JSR-160激活的MbeanServer,使用如下的MbeanServerConnectionFactoryBean:
代碼:
<bean id="clientConnector" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean">
  <property name="serviceUrl" value="service:jmx:rmi://localhost:9875"/>
</bean>

19.5.3. 通過Burlap/Hessian/SOAP的JMX
JSR-160允許擴展在客戶端和服務端之間進行通訊的方法。上例中使用了JSR-160中RMI-based實現,JSR-160中要求通過(IIOP和JRMP)和可選的JMXMP的方式。使用其它的提供者或實現,如MX4J[http://mx4j.sourceforge.net],你可以使用基於HTTP或SSL方式的協議如SOAP、Hessian、Burlap和其它:
代碼:
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean">
  <property name="objectName" value="connector:name=burlap"/>
  <property name="serviceUrl" value="service:jmx:burlap://localhost:9874"/>
</bean>

這個是使用MX4J 3.0.0的例子,更多信息請查閱MX4J的官方文檔。
19.6. 通過代理訪問MBeans
Spring JMX允許你創建代理改變路線調用在本地或遠程MbeanServer上定義的Mbeans。該代理提供一個標準的Java接口使你能同你的Mbeans進行交互。下面的代碼顯示如何爲運行在本地MbeanServer的MBean配置一個代理:
代碼:
<bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
  <property name="objectName">
      <value>bean:name=testBean</value>
  </property>
  <property name="proxyInterface">
    <value>org.springframework.jmx.IJmxTestBean</value>
  </property>
</bean>

這裏你可以看到爲註冊在ObjectName: bean:name=testBean下的Mbean創建了一個代理。該代理將實現的接口集由proxyInterfaces屬性控制,而這個接口中方法和屬性到Mbean上操作和參數的映射規則和在InterfaceBasedMBeanInfoAssembler中使用的一樣。
MbeanProxyFactoryBean可以爲任何能通過MbeanServerConnection訪問的Mbean創建代理。默認的,本地MbeanServer只能在本地使用,但是你能覆蓋它並提供一個MbeanServerConnection指向一個遠程的MbeanServer,從而允許代理指向遠程的Mbeans:
代碼:
<bean id="clientConnector" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean">
  <property name="serviceUrl" value="service:jmx:rmi://remotehost:9875"/>
</bean>
<bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
  <property name="objectName" value="bean:name=testBean"/>
  <property name="proxyInterface" value="org.springframework.jmx.IJmxTestBean"/>
</bean>

這裏你可以看到我們使用MBeanServerConnectionFactoryBean創建一個MbeanServerConnection指向一個遠程機器。該MbeanServerConnection通過server屬性傳入到MbeanProxyFactoryBean。所創建的代理通過這個MbeanServerConnection傳遞所有給MbeanServer的調用。
發佈了27 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章