JavaTM 2 Platform
Standard Ed. 6

軟體套件 javax.management.remote.rmi

RMI 連接器是供 JMX Remote API 使用的一種連接器,後者使用 RMI 將客戶端請求傳輸到遠端 MBean 伺服器。

請參見:
          描述

介面摘要
RMIConnection RMI 物件,用於將 MBeanServer 請求從客戶端轉發到其位於伺服器端的 MBeanServer 實作。
RMIServer 用於建立到 RMI 連接器的連接的 RMI 物件。
 

類別摘要
RMIConnectionImpl RMIConnection 介面的實作。
RMIConnectionImpl_Stub  
RMIConnector 一個到遠端 RMI 連接器的連接。
RMIConnectorServer JMX API 連接器伺服器,用於從遠端客戶端創建基於 RMI 的連接。
RMIIIOPServerImpl 一個 RMIServerImpl,它通過 IIOP 導出,並可創建如同由 IIOP 導出的 RMI 物件的客戶端連接。
RMIJRMPServerImpl 一個 RMIServer 物件,它通過 JRMP 導出,並可創建如同由 JRMP 導出的 RMI 物件的客戶端連接。
RMIServerImpl 表示連接器伺服器的 RMI 物件。
RMIServerImpl_Stub  
 

軟體套件 javax.management.remote.rmi 的描述

RMI 連接器是供 JMX Remote API 使用的一種連接器,後者使用 RMI 將客戶端請求傳輸到遠端 MBean 伺服器。此套件定義了 RMI 連接器的使用者直接參考客戶端和伺服器方所需的類別。它還定義了其他一些類別,使用者雖然不經常直接參考這些類別,但還是必須定義它們,主要是為 RMI 連接器的不同實作之間實作互操作。

RMI 連接器支持 RMI 的 JRMP 和 IIOP 傳輸方式。

與 JMX Remote API 中的多數連接器類似,RMI 連接器通常有一個位址,它是一個 JMXServiceURL。對於使用預設 RMI 傳輸方式 (JRMP) 的連接器,此位址的協議部分為 rmi;對於使用 RMI/IIOP 的連接器,位址的協議部分為 iiop

RMI 連接器位址有兩種形式:

以下內容更詳細地介紹了位址。

創建 RMI 連接器伺服器

創建 RMI 連接器伺服器的一般方法是為方法 JMXConnectorServerFactory.newJMXConnectorServer 提供一個 RMI 連接器位址。將與連接器伺服器連接的 MBean 伺服器可作為該方法的一個參數指定。或者,也可以將連接器伺服器註冊為該 MBean 伺服器中的 MBean。

還可以通過建構 RMIConnectorServer 的實例(顯式或使用 MBean 伺服器的 createMBean 方法)來創建 RMI 連接器伺服器。

選擇 RMI 傳輸方式

在創建連接器伺服器時,通過在 serviceURLprotocol 部分指定 rmiiiop,您可以選擇 RMI 傳輸方式(JRMP 或 IIOP)。通過實例化 RMIServerImpl 的一個適當的子類別並將其提供給 RMIConnectorServer 建構子,還可以創建特殊的連接器伺服器。

伺服器產生的連接器位址

如果您指定的 serviceURL 套件含空 URL 路徑(在可選的主機和埠號後),或者未指定 serviceURL,則連接器伺服器將創建一個可供客戶端連接使用的新 JMXServiceURL

使用者提供的 serviceURL 中的 host 為可選項。如果有這一項,則將其複製到產生的 JMXServiceURL 中,但是其他方面會忽略此項。如果沒有這一項,則產生的 JXMServiceURL 將包括本地主機名。

使用者提供的 serviceURL 中的 port 也是一個可選項。如果有這一項,則同樣將其複製到產生的 JMXServiceURL 中;否則,產生的 JMXServiceURL 不帶埠號。對於使用 rmi 協議的 serviceURL,如果有 port,則它指示產生的遠端物件應在該埠號上導出。它沒有任何其他作用。

如果使用者提供了 RMIServerImpl 而不是 JMXServiceURL,則產生的 JMXServiceURL 將在其 host 部分包含本地主機名並且不帶 port

基於目錄條目的連接器位址

作為剛才介紹的產生位址的另外一種情況,創建連接器伺服器時提供的 serviceURL 位址指定的是目錄位址,其中可存儲提供的或產生的 RMIServer 樁模組。然後客戶端和伺服器都可以使用此目錄位址。

這種情況下,serviceURL 具有如下兩種形式之一:

    service:jmx:rmi://host:port/jndi/jndi-name
    service:jmx:iiop://host:port/jndi/jndi-name
    

其中 jndi-name 是一個可提供給 javax.naming.InitialContext.bind 的字元串。

同樣,host:port 均可忽略。

連接器伺服器將基於協議(rmiiiop),對於 rmi,還包括 port(如果有)產生 RMIServerImpl。連接器伺服器啟動後,它將從此物件使用其 toStub 方法派生一個樁模組並使用給定的 jndi-name 保存該物件。同樣也要參考由 JNDI API 定義的屬性。

例如,假設 JMXServiceURL 為:

      service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
      
則連接器伺服器將產生 RMIJRMPServerImpl 並使用該 JNDI 名稱保存其樁模組
      rmi://myhost/myname
      
它表示運行在主機 myhost 的預設埠號上 RMI 註冊表中的 myname 項。注意,RMI 註冊表只允許從本地主機註冊。因此在這種情況下,myhost 必須是運行連接器伺服器的主機名。

在此 JMXServiceURL 中,第一個 rmi: 指定 RMI 連接器,第二個 rmi: 指定 RMI 註冊表。

另舉一個例子,如果 JMXServiceURL 為:

      service:jmx:iiop://ignoredhost/jndi/ldap://dirhost:9999/cn=this,ou=that
      
則該連接器伺服器將產生 RMIIIOPServerImpl 並使用該 JNDI 名稱保存其樁模組
      ldap://dirhost:9999/cn=this,ou=that
      
它表示 LDAP 目錄中的 cn=this,ou=that 條目,該目錄在運行主機 dirhost 的埠號 9999 上。

如果 JMXServiceURL 為:

      service:jmx:iiop://ignoredhost/jndi/cn=this,ou=that
      
則該連接器伺服器將產生 RMIIIOPServerImpl 並使用該 JNDI 名稱保存其樁模組
      cn=this,ou=that
      
要在這種情況下正常工作,JNDI API 必須經過適當配置,以提供有關要使用的目錄的資訊。

這些範例中,主機名 ignoredhost 未被連接器伺服器或其客戶端使用。可將其忽略,例如:

      service:jmx:iiop:///jndi/cn=this,ou=that
      

但是,在連接器伺服器運行的主機上使用主機名是一個不錯的做法。主機名通常不同於目錄主機的名稱。

連接器伺服器的屬性

使用預設的 JRMP 傳輸方式時,可使用為 RMIConnectorServer 建構子給定的 environment 中的 jmx.remote.rmi.client.socket.factoryjmx.remote.rmi.server.socket.factory 屬性指定 RMI Socket處理器。這些屬性的值的型別必須分別為 RMIClientSocketFactoryRMIServerSocketFactory。這些處理器在創建與連接器關聯的 RMI 物件時使用。

創建 RMI 連接器客戶端

RMI 連接器客戶端通常使用 JMXConnectorFactory 且具有協議 rmiiiopJMXServiceURL 進行建構。

如果 JMXServiceURL 由伺服器產生,如上文中的“伺服器產生的連接器位址”所述,則客戶端將需要直接或間接地從伺服器獲取該值。通常,伺服器將 JMXServiceURL 存儲在一個檔案或尋找服務中以便於使用。

如果 JMXServiceURL 使用目錄語法,如上文中的“基於目錄條目的連接器位址”所述,則客戶端可用剛剛介紹的方法獲取該值,或者客戶端和伺服器可能都知道要使用的適當目錄條目。例如,如果 Whatsit 代理的連接器伺服器使用主機 myhost 上 RMI 註冊表中的 whatsit-agent-connector 條目,則客戶端和伺服器都知道適當的 JMXServiceURL 為:

    service:jmx:rmi:///jndi/rmi://myhost/whatsit-agent-connector
    

如果 RMI 樁模組的型別為 RMIServer,則可以使用 RMIConnector 的適當建構子直接建構 RMI 連接。

為 RMI/IIOP 連接器指定一個 ORB

使用 IIOP 傳輸方式時,客戶端和伺服器可使用屬性 java.naming.corba.orb 指定要使用的 ORB。連接器伺服器連接到 ORB 的動作發生時間為 start,連接器客戶端連接到 ORB 的動作發生時間為 connect。如果 java.naming.corba.orb 屬性包含在環境 Map 中,則其值(一個 ORB)將用於連接 IIOP Stub。否則,將通過調用 org.omg.CORBA.ORB.init((String[])null,(Properties)null) 創建一個新的 org.omg.CORBA.ORB。位於同一 JVM 中的後續 RMI 連接器客戶端或伺服器可重用此 ORB,或者可用同樣的方式創建另一個 ORB。

如果指定了 java.naming.corba.orb 屬性但它並不指向一個 ORB,則將拋出 IllegalArgumentException

當 IIOP 遠端物件(Stub 或 Server)在被傳入到 RMIConnector 和 RMIConnectorServer 之前通過手動創建和連接到 ORB 時,這裡描述的機制將不適用。

動態程式碼下載

如果 RMI 連接器客戶端或伺服器從其同級設備收到一個無法識別的類別實例,並且動態程式碼下載此時可以進行 RMI 連接,則可以從同級設備指定的程式碼基下載類別。文章 Dynamic code downloading using Java RMI 對此進行了詳細解釋。

從以下版本開始:
1.5
另請參見:
JavaTM Remote Method Invocation (RMI), Java Naming and Directory InterfaceTM (JNDI), RFC 2045, section 6.8, "Base64 Content-Transfer-Encoding"

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only