6 注册表接口


RMI系统使用java.rmi.registry.Registry接口和java.rmi.registry.LocateRegistry类提供一个众所周知的引导服务,用于通过简单名称检索和注册对象。

注册表是一个远程对象,将名称映射到远程对象。任何服务器进程都可以支持自己的注册表,或者一个主机可以使用单个注册表。

LocateRegistry的方法用于获取在特定主机或主机和端口上运行的注册表。java.rmi.Naming类的方法使用适当的LocateRegistry.getRegistry方法调用实现Registry接口的远程对象。

6.1 注册表接口

查看Registry API文档。

6.2 LocateRegistry类

java.rmi.registry.LocateRegistry类用于获取引导远程对象注册表的引用(构造存根),该注册表位于特定主机(包括本地主机)上,或者在特定端口上接受调用的远程对象注册表。

注册表实现了一个简单的平面命名语法,将远程对象的名称(字符串)与远程对象引用关联起来。名称和远程对象绑定不会在服务器重新启动时记住。

请注意,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方法返回对当前主机、指定端口的当前主机、指定主机或指定主机上特定端口的注册表的引用。返回的是具有指定主机和端口信息的注册表的远程存根。

第五个getRegistry方法(其中一个参数是RMIClientSocketFactory)返回对指定主机和端口上的远程对象Registry的本地创建的存根。使用此方法构造的远程注册表的通信将使用提供的RMIClientSocketFactorycsf创建到远程主机和端口上的注册表的Socket连接。

注意:从getRegistry方法返回的注册表是一个特殊构造的存根,其中包含一个众所周知的对象标识符。不支持将注册表存根从一个JVM传递到另一个JVM(这取决于实现,可能有效也可能无效)。使用LocateRegistry.getRegistry方法获取主机的适当注册表。

createRegistry方法在本地主机上指定端口创建和导出注册表。

第二个createRegistry方法允许在与注册表通信时更灵活。此调用在本地主机上创建和导出使用自定义套接字工厂与该注册表通信的Registry。创建的注册表侦听给定端口上的传入请求,使用从提供的RMIServerSocketFactory创建的ServerSocket。接收对此注册表的引用的客户端将使用从提供的RMIClientSocketFactory创建的Socket。

注意:使用createRegistry方法启动注册表不会保持服务器进程处于活动状态。

6.3 RegistryHandler接口

查看RegistryHandler API文档。