RMI 系統使用 java.rmi.registry.Registry 接口和 java.rmi.registry.Locat
eRegistry 類來為按名字檢索和注冊對象提供眾所周知的自舉服務。
registry 是一種將名字映射到遠程對象的遠程對象。所有的服務器進程都支持自
己的注冊服務程序或能為主機所用的單個注冊服務程序。
LocateRegistry 方法用于使注冊服務程序在特定的主機中或主機與端口中運行起
來。java.rmi.Naming 類方法用于調用一個遠程對象,該對象使用恰當的 Locat
eRegistry.getRegistry 方法來實現 Registry 接口。
主題:
Registry 接口
LocateRegistry 類
RegistryHandler 接口
6.1 Registry 接口
java.rmi.registry.Registry 遠程接口可為查詢、綁定、再綁定、取消綁定和列
出注冊服務程序內容提供方法。java.rmi.Naming 類用 registry 遠程接口提供
基于 URL 的命名。
package java.rmi.registry;
public interface Registry extends java.rmi.Remote {
public static final int REGISTRY_PORT = 1099;
public java.rmi.Remote lookup(String name)
throws java.rmi.RemoteException,
java.rmi.NotBoundException, java.rmi.AccessException;
public void bind(String name, java.rmi.Remote obj)
throws java.rmi.RemoteException,
java.rmi.AlreadyBoundException, java.rmi.AccessException;
public void rebind(String name, java.rmi.Remote obj)
throws java.rmi.RemoteException, java.rmi.AccessException;
public void unbind(String name)
throws java.rmi.RemoteException,
java.rmi.NotBoundException, java.rmi.AccessException;
public String[] list()
throws java.rmi.RemoteException, java.rmi.AccessException;
}
REGISTRY_PORT 是注冊服務程序的缺省端口。
lookup 方法返回綁定到指定 name 的遠程對象,而遠程對象則實現一組遠程接口
。客戶機可將遠程對象強制轉換為所期望的遠程接口類型(該強制類型轉換可能
以它在 Java 語言中的常見失敗方式而失敗)。
bind 方法將 name 與遠程對象 obj 相關聯。如果名字已綁定到某一對象上,則
拋出 AlreadyBoundExcepton。
rebind 方法將 name 與遠程對象 obj 相關聯。該名字以前的所有綁定均將被丟
棄。
unbind 方法刪除 name 和遠程對象 obj 之間的綁定。如果名字并未綁定到某一
對象上,則拋出 NotBoundException。
list 方法返回一個 Strings 數組,其中包含注冊服務程序中所綁名字的快照。
該返回值含有注冊服務程序內容的快照。
客戶機可以使用 LocateRegistry 和 Registry 接口或基于 URL 的 java.rmi.N
aming 類的方法來訪問注冊服務程序。該注冊服務程序僅支持與服務器位于同一
主機的客戶機的 bind、unbind 和 rebind。所有主機均可進行查詢操作。
.2 LocateRegistry 類
java.rmi.registry.LocateRegistry 類用來獲得對特定主機(包括本地主機)的
引導遠程對象注冊服務程序的引用(創建 stub),或者創建能在特定端口接受調
用的遠程對象注冊服務程序。
注冊服務程序實現將遠程對象名(字符串)與遠程對象引用相關聯的簡單命名語
法。服務器重新啟動不會記住這些名字和遠程對象之間的綁定。
注意,getRegistry 調用并不真正與遠程主機連接。它只簡單地建立了對遠程注
冊服務程序的本地引用,且即使遠程主機中沒有注冊服務程序運行也將獲得成功
。因此,對于該方法作為返回值返回的遠程注冊服務程序進行進一步的方法調用
時,可能會導致失敗。
package java.rmi.registry;
public final class LocateRegistry
{
public static Registry getRegistry()
throws java.rmi.RemoteException;
public static Registry getRegistry(int port)
throws java.rmi.RemoteException;
public static Registry getRegistry(String host)
throws java.rmi.RemoteException;
public static Registry getRegistry(String host, int port)
throws java.rmi.RemoteException;
public static Registry getRegistry(String host, int port,
RMIClientSocketFactory csf)
throws RemoteException;
public static Registry createRegistry(int port)
throws java.rmi.RemoteException;
public static Registry createRegistry(int port,
RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
throws RemoteException;
}
前四個 getRegistry 方法返回對當前主機、指定 port 的當前主機、指定的 ho
st 或指定 host 的特定 port 的注冊服務程序引用。所返回的是帶有指定主機和
端口信息的注冊服務程序的遠程 stub。
第五個 getRegistry 方法(將 RMIClientSocketFactory 作為參數)返回本地創
建的遠程 stub,它對應于指定 host 和 port 上的遠程對象 Registry。與用該
方法構造 stub 的遠程注冊服務程序進行通信時,將使用所提供的 RMIClientSo
cketFactory、csf 來創建到遠程主機和端口的注冊服務程序的 Socket 連接。
----------------------------------------------------------------------
----------
注意 - 從 getRegistry 方法返回的注冊服務程序是含有已知對象標識符的專門
構造的 stub。目前仍不支持將注冊服務程序 stub 從一個虛擬機傳給另一個虛擬
機(其有效性將取決于實現)。使用 LocateRegistry.getRegistry 方法可以獲
得主機的相應注冊服務程序。
----------------------------------------------------------------------
----------
createRegistry 方法創建和導出特定 port 的本地主機的注冊服務程序。
第二種 createRegistry 方法在與注冊服務程序通信時更富有靈活性。該調用將
在本地主機中創建和導出 Registry,本地主機使用自定義套接字工廠用于與注冊
服務程序的通信。所創建的注冊服務程序在給定的 port 上使用從 RMIServerSo
cketFactory 所創建的 ServerSocket 監聽到來請求。接收到注冊服務程序引用
的客戶機將使用從 RMIClientSocketFactory 所創建的 Socket。
----------------------------------------------------------------------
----------
注意 - 使用 createRegistry 方法啟動注冊服務程序不能保持服務器進程的活動
性。
6.3 RegistryHandler 接口
----------------------------------------------------------------------
----------
注意 - JDK1.2 中不鼓勵使用 RegistryHandler 接口。JDK1.1 中,它僅由 RMI
實現在內部使用,而不能用于應用程序。
----------------------------------------------------------------------
----------
package java.rmi.registry;
public interface RegistryHandler
{
Registry registryStub(String host, int port)
throws java.rmi.RemoteException, java.rmi.UnknownHostException;
Registry registryImpl(int port) throws java.rmi.RemoteException;
}
方法 registryStub 返回一個與位于指定主機和端口的遠程注冊服務程序進行聯
系的 stub。
方法 registryImpl 將構造并導出位于指定的端口的注冊服務程序。端口必須為
非零。
凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
、轉載請注明來處和原文作者。非常感謝。