
Java的遠端方法調用(RMI)架構可以為你建立虛拟的透明的分布式服務和程式。基于RMI的程式包含能夠使不同位置的程式進行互相調用的方法。這一特性使得Java對象能夠調用其他虛拟機器上的Java對象,同樣的,其他虛拟機器上的Java對象也可以以相同方式調用這一台機器上的Java對象。
界面
每一個遠端對象都必須具有輸出端口,這樣它才能接收輸入的遠端方法請求。遠端對象可以通過調用以下的方法人工地設定輸出端口:
java.rmi.server.UnicastRemoteObject.exportObjec方法或者
java.rmi.activation.Activatable.exportObject方法。
當遠端對象使用java.rmi.server.UnicastRemoteObject
或者java.rmi.activation.Activatable時,它們也自動地設定了輸出口。
傳遞java.rmi.RemoteException的構造函數不能夠被忽略,因為輸出過程可能會失敗。TimeKeeper遠端對象界面的一個合法的執行操作。
RMI系統資料庫
RMI定義了作為RMI系統資料庫的一個遠端對象庫。一個RMI系統資料庫其實是一個簡單的名稱伺服器,它保持對遠端對象的引用,并使它們與RMI伺服器連接配接。
在一個基于UNIX的作業系統,使用以下的指令行來啟動RMI系統資料庫:
rmiregistry &
在Windows作業系統,RMI系統資料庫必須運作在端口1099。當啟動系統資料庫時,你可以通過指定端口數目來設定一個不同的端口。例如,以下的代碼行将啟動Windows系統中3000端口的系統資料庫:
start rmiregistry
3000
RMI伺服器
為了能夠保證遠端對象得到連接配接與使用,遠端對象客戶必須連接配接到包含對象引用的RMI伺服器。一個RMI伺服器是一個簡單的Java類,它能夠執行一個主程式,輸出每一個遠端對象,連接配接對象執行個體到RMI系統資料庫的名稱。
無論在任何時候通過JVM下載下傳代碼,一定要考慮到安全問題,以此避免系統出現對象執行不安全的操作。是以,RMI伺服器的主程式一定建立和安裝一個安全管理系統,如以下範例所示:
if (System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
}
RMI伺服器建立遠端對象的例子,然後将它們連接配接到一個可以被遠端客戶識别和調用的名稱,如下代碼所示:
TimeKeeperImplobj = new TimeKeeperImpl();// instantiate the object
Naming.rebind("//myhost/TimeKeeper", obj);
// bind the object to a name
當遠端對象被示例化時,它即被設定輸出端口并可以接收請求的調用。
一旦一個遠端對象被示例化,以及被一個名稱連接配接,遠端調用者可以通過名稱而識别能者對象,獲得遠端對象引用,并且能夠調用對象中的方法。
啟動伺服器
啟動一個RMI伺服器隻需要運作伺服器,這與運作一個普通的Java程式一樣。然而,幾個名稱/值的屬性必須在指令行中得到定義:
java.rmi.server.codebase屬性被定義,這樣類就可以被動态地下載下傳到系統資料庫,然而傳遞到用戶端。
java.security.policy屬性被定義,這樣伺服器就可以識别哪些安全措施需要執行。
SimpleRMIServer,設定java.rmi.server.codebase屬性到http://myhost/~jeff/remoteobjects及java.security.policy屬性到OME/jeff/policies/policy。
SimpleRMIServer被啟動之後,你可以看到以下的輸出:
TimeKeeper is bound in the registry
總結
在這一篇文章中,我們探索了RMI如何被用于建立遠端連接配接,能夠為開發人員集中精力于通訊體系之外的有關難點。Java的遠端方法調用架構能夠讓你建立虛拟的透明的分布式服務和程式。基于RMI的程式可以使得Java對象互相得到調用。
責任編輯:李甯