注册服务程序接口
---------------------------------------------------------------------
----------
第 6 章
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 将构造并导出位于指定的端口的注册服务程序。端口必须为
非零。