RMI客户端如何查看并获取在注册表中注册的所有动态远程对象?

时间:2015-10-05 02:14:21

标签: java rmi rmiregistry

我要求RMI客户端需要获取在远程RMI注册表中注册的所有远程对象。

第一个问题,我知道有一个registry.list()方法可以返回对象的所有名称。但是,我如何获得我想要的类型的对象(实现我想要的接口),假设还注册了其他种类的对象。我应该遍历名称并使用try / catch语句,尝试实例化每个远程对象吗?

第二个问题,如果注册了新对象,客户端如何被注意到?在我的要求中,服务器将动态地将新对象注册到注册表中,并且客户端需要更新并更快地访问新对象。我是否只是使用一个线程来定期列出所有名称以找出新对象?

请注意,远程对象将从不同节点导出,但不能从同一节点导出。我知道如果它们来自同一节点,我可以使用从其中一个实例化远程对象调用的回调功能。

1 个答案:

答案 0 :(得分:4)

  

RMI客户端如何查看并获取在注册表中注册的所有动态远程对象?

致电Naming.list()Registry.list().

  

我要求RMI客户端需要在远程RMI注册表中注册所有远程对象。

见上文。

  

如何获得我想要的类型的对象(实现我想要的接口),假设还注册了其他种类的对象?我应该遍历名称并使用try / catch语句,尝试实例化每个远程对象吗?

只需遍历list()返回的名称;每个lookup();并使用instanceof确定它是否属于您需要的类型。如果注册表包含存根,您没有在客户端拥有所有必需的类,则需要捕获ClassNotFoundException。通过JNDI listBindings()方法,以更少的步骤完成所有这些操作的简单方法。

  

第二个问题,如果注册了新对象,客户端如何被注意到?

它不能。没有为RMI注册表定义的侦听器系统。客户必须进行民意调查。

  

在我的要求中,服务器将动态地将新对象注册到注册表中,并且客户端需要更新并更快地访问新对象。我是否只是使用一个线程来定期列出所有名称以找出新对象?

  

请注意,远程对象将从不同节点导出,但不能从同一节点导出。

您会发现难以安排,因为您只能与注册表中的同一主机呼叫bind()和朋友。您必须组织一些中间远程对象来为每个非本地节点进行注册。

  

我知道他们是否来自同一个节点,我可以使用从其中一个实例化远程对象调用的回调功能。

来自同一节点不是前提条件。您可以在防火墙不受阻碍的任何拓扑中执行RMI回调。