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

Java RMI客户端如何查看和获取注册在注册表中的所有动态远程对象?,java,rmi,rmiregistry,Java,Rmi,Rmiregistry,我要求RMI客户端需要在远程RMI注册表中注册所有远程对象 第一个问题,我知道有一个registry.list()方法返回所有对象的名称。但是,如果还注册了其他类型的对象,那么如何获得我想要的类型的对象(实现我想要的接口)。我是否应该遍历名称并使用try/catch语句,尝试实例化每个远程对象 第二个问题,如果注册了一个新对象,客户机如何引起注意?在我的要求中,服务器将动态地在注册表中注册新对象,客户机需要更新并更快地访问新对象。我是否应该使用线程定期列出所有名称以查找新对象 请注意,远程对象将

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

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

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

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

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

通过调用
Naming.list()
Registry.list()。

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

见上文

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

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

第二个问题,如果注册了一个新对象,客户机如何引起注意

不可能。没有为RMI注册表定义侦听器系统。客户必须进行投票

在我的要求中,服务器将动态地在注册表中注册新对象,客户机需要更新并更快地访问新对象。我是否应该使用线程定期列出所有名称以查找新对象

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

您会发现这很难安排,因为您只能从与注册表相同的主机调用
bind()
和friends。您必须组织一些中间远程对象来为每个非本地节点进行注册

我知道如果它们来自同一个节点,可能我可以使用从实例化的远程对象之一调用的回调功能

来自同一个节点不是这样做的先决条件。您可以在防火墙不妨碍的任何拓扑中执行RMI回调

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

通过调用
Naming.list()
Registry.list()。

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

见上文

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

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

第二个问题,如果注册了一个新对象,客户机如何引起注意

不可能。没有为RMI注册表定义侦听器系统。客户必须进行投票

在我的要求中,服务器将动态地在注册表中注册新对象,客户机需要更新并更快地访问新对象。我是否应该使用线程定期列出所有名称以查找新对象

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

您会发现这很难安排,因为您只能从与注册表相同的主机调用
bind()
和friends。您必须组织一些中间远程对象来为每个非本地节点进行注册

我知道如果它们来自同一个节点,可能我可以使用从实例化的远程对象之一调用的回调功能


来自同一个节点不是这样做的先决条件。您可以在防火墙不妨碍的任何拓扑中执行RMI回调。

没有
ClassCastExceptions
的一种更简单的方法是通过
javax.naming.Context.list()
方法,该方法返回对{name,class name}的枚举,而无需检索对象。当我试图研究javax.naming的用法时,我找到了以下接口:javax.naming.event.NamingListener。从描述来看,它似乎可以用来侦听命名更改事件,如添加名称等。这是否适用于我的要求?我尝试了javax.naming.Context.list(),但不知道getClassName()总是返回java.lang.object而不是实际运行的类名的原因。。。如果我尝试listBindings(),它总是返回com.sun.proxy.$proxy,其中#是一个数字