我有一个需求,RMI客户端需要在远程RMI注册中心中注册所有远程对象。
第一个问题,我知道有一个registry.list()方法返回所有对象的名称。然而,我如何获得我想要的类型的对象(实现我想要的接口),假设也有其他类型的对象注册。我应该遍历名称并使用try/catch语句,尝试实例化每个远程对象吗?
第二个问题,如果注册了一个新对象,客户端如何被注意到?在我的需求中,服务器将动态地将新对象注册到注册中心,客户端需要更快地获得更新并访问新对象。我是否应该使用一个线程来周期性地列出所有的名字来发现新的对象?
请注意,远程对象将从不同节点导出,而不是从同一节点导出。我知道它们是否来自同一节点,可能我可以使用从实例化的远程对象之一调用的回调特性。
RMI客户端如何查看并获得注册中心中注册的所有动态远程对象?
通过调用Naming.list()
或Registry.list().
我有一个需求,RMI客户端需要在远程RMI注册中心中注册所有远程对象。
见上图。
假设还有其他类型的对象注册,我如何获得我想要的类型的对象(实现我想要的接口)?我应该遍历名称并使用try/catch语句,尝试实例化每个远程对象吗?
只遍历list()
返回的名称;lookup()
各一;并使用instanceof
来确定它是否是您需要的类型。如果注册表包含存根,您在客户端没有所有必需的类,则需要捕获ClassNotFoundException
。用更少的步骤完成所有这些的简单方法是通过JNDI listBindings()
方法。
第二个问题,如果注册了一个新对象,客户端如何被注意到?
它不能。没有为RMI Registry定义侦听器系统。客户端必须轮询。
在我的要求中,服务器将动态地将新对象注册到注册中心,客户端需要更快地获得更新并访问新对象。我是否应该使用一个线程来周期性地列出所有的名字来发现新的对象?
是的。
请注意,远程对象将从不同节点导出,但不能从同一节点导出。
你会发现这很难安排,因为你只能从与注册表相同的主机调用bind()
和朋友。您必须组织一些中间远程对象来为每个非本地节点进行注册。
我知道它们是否来自同一节点,可能我可以使用从实例化的远程对象之一调用的回调特性。
来自同一节点并不是前提条件。您可以在任何不受防火墙阻碍的拓扑结构中执行RMI回调。