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