注冊服務(wù)程序接口
---------------------------------------------------------------------
----------
第 6 章
RMI 系統(tǒng)使用 java.rmi.registry.Registry 接口和 java.rmi.registry.Locat
eRegistry 類來為按名字檢索和注冊對象提供眾所周知的自舉服務(wù)。
registry 是一種將名字映射到遠程對象的遠程對象。所有的服務(wù)器進程都支持自
己的注冊服務(wù)程序或能為主機所用的單個注冊服務(wù)程序。
LocateRegistry 方法用于使注冊服務(wù)程序在特定的主機中或主機與端口中運行起
來。java.rmi.Naming 類方法用于調(diào)用一個遠程對象,該對象使用恰當?shù)?Locat
eRegistry.getRegistry 方法來實現(xiàn) Registry 接口。
主題:
Registry 接口
LocateRegistry 類
RegistryHandler 接口
6.1 Registry 接口
java.rmi.registry.Registry 遠程接口可為查詢、綁定、再綁定、取消綁定和列
出注冊服務(wù)程序內(nèi)容提供方法。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 是注冊服務(wù)程序的缺省端口。
lookup 方法返回綁定到指定 name 的遠程對象,而遠程對象則實現(xiàn)一組遠程接口
??蛻魴C可將遠程對象強制轉(zhuǎn)換為所期望的遠程接口類型(該強制類型轉(zhuǎn)換可能
以它在 Java 語言中的常見失敗方式而失?。?
bind 方法將 name 與遠程對象 obj 相關(guān)聯(lián)。如果名字已綁定到某一對象上,則
拋出 AlreadyBoundExcepton。
rebind 方法將 name 與遠程對象 obj 相關(guān)聯(lián)。該名字以前的所有綁定均將被丟
棄。
unbind 方法刪除 name 和遠程對象 obj 之間的綁定。如果名字并未綁定到某一
對象上,則拋出 NotBoundException。
list 方法返回一個 Strings 數(shù)組,其中包含注冊服務(wù)程序中所綁名字的快照。
該返回值含有注冊服務(wù)程序內(nèi)容的快照。
客戶機可以使用 LocateRegistry 和 Registry 接口或基于 URL 的 java.rmi.N
aming 類的方法來訪問注冊服務(wù)程序。該注冊服務(wù)程序僅支持與服務(wù)器位于同一
主機的客戶機的 bind、unbind 和 rebind。所有主機均可進行查詢操作。
.2 LocateRegistry 類
java.rmi.registry.LocateRegistry 類用來獲得對特定主機(包括本地主機)的
引導(dǎo)遠程對象注冊服務(wù)程序的引用(創(chuàng)建 stub),或者創(chuàng)建能在特定端口接受調(diào)
用的遠程對象注冊服務(wù)程序。
注冊服務(wù)程序?qū)崿F(xiàn)將遠程對象名(字符串)與遠程對象引用相關(guān)聯(lián)的簡單命名語
法。服務(wù)器重新啟動不會記住這些名字和遠程對象之間的綁定。
注意,getRegistry 調(diào)用并不真正與遠程主機連接。它只簡單地建立了對遠程注
冊服務(wù)程序的本地引用,且即使遠程主機中沒有注冊服務(wù)程序運行也將獲得成功
。因此,對于該方法作為返回值返回的遠程注冊服務(wù)程序進行進一步的方法調(diào)用
時,可能會導(dǎo)致失敗。
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 的注冊服務(wù)程序引用。所返回的是帶有指定主機和
端口信息的注冊服務(wù)程序的遠程 stub。
第五個 getRegistry 方法(將 RMIClientSocketFactory 作為參數(shù))返回本地創(chuàng)
建的遠程 stub,它對應(yīng)于指定 host 和 port 上的遠程對象 Registry。與用該
方法構(gòu)造 stub 的遠程注冊服務(wù)程序進行通信時,將使用所提供的 RMIClientSo
cketFactory、csf 來創(chuàng)建到遠程主機和端口的注冊服務(wù)程序的 Socket 連接。
----------------------------------------------------------------------
----------
注意 - 從 getRegistry 方法返回的注冊服務(wù)程序是含有已知對象標識符的專門
構(gòu)造的 stub。目前仍不支持將注冊服務(wù)程序 stub 從一個虛擬機傳給另一個虛擬
機(其有效性將取決于實現(xiàn))。使用 LocateRegistry.getRegistry 方法可以獲
得主機的相應(yīng)注冊服務(wù)程序。
----------------------------------------------------------------------
----------
createRegistry 方法創(chuàng)建和導(dǎo)出特定 port 的本地主機的注冊服務(wù)程序。
第二種 createRegistry 方法在與注冊服務(wù)程序通信時更富有靈活性。該調(diào)用將
在本地主機中創(chuàng)建和導(dǎo)出 Registry,本地主機使用自定義套接字工廠用于與注冊
服務(wù)程序的通信。所創(chuàng)建的注冊服務(wù)程序在給定的 port 上使用從 RMIServerSo
cketFactory 所創(chuàng)建的 ServerSocket 監(jiān)聽到來請求。接收到注冊服務(wù)程序引用
的客戶機將使用從 RMIClientSocketFactory 所創(chuàng)建的 Socket。
----------------------------------------------------------------------
----------
注意 - 使用 createRegistry 方法啟動注冊服務(wù)程序不能保持服務(wù)器進程的活動
性。
6.3 RegistryHandler 接口
----------------------------------------------------------------------
----------
注意 - JDK1.2 中不鼓勵使用 RegistryHandler 接口。JDK1.1 中,它僅由 RMI
實現(xiàn)在內(nèi)部使用,而不能用于應(yīng)用程序。
----------------------------------------------------------------------
----------
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 返回一個與位于指定主機和端口的遠程注冊服務(wù)程序進行聯(lián)
系的 stub。
方法 registryImpl 將構(gòu)造并導(dǎo)出位于指定的端口的注冊服務(wù)程序。端口必須為
非零。