2015-10-05 75 views
1

我有一个要求,即RMI客户端需要获取远程RMI注册表中注册的所有远程对象。RMI客户端如何看到并获取在注册表中注册的所有动态远程对象?

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

第二个问题,如果一个新的对象被注册,客户怎么会注意到?在我的要求中,服务器将动态注册到注册表中的新对象,并且客户端需要更新并更快访问新对象。我应该使用一个线程来定期列出所有的名字来找出新的对象吗?

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

回答

3

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

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

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

参见上文。

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

只是遍历由list()返回的名称;每一个都是lookup();并使用instanceof来确定它是否是您需要的类型。如果注册管理机构包含存根(stub),则您没有为客户提供所有必需的课程,您需要注意ClassNotFoundException。通过JNDI listBindings()方法以较少的步骤完成所有这些操作的简单方法。

第二个问题,如何可以在客户端获取如果一个新的对象被注册注意到了吗?

它不能。没有为RMI注册表定义监听器系统。客户将不得不进行民意调查。

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

是的。

请注意,远程对象是从不同的节点出口,但不能从同一个节点。

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

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

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

+0

谢谢你的明确答案。它有助于! –

+0

没有'ClassCastExceptions'的更简单的方法是通过'javax.naming.Context.list()'方法,它返回一对枚举类型'{name,class-name},而不需要检索对象。 – EJP

+0

当我试图查看javax.naming的用法时,发现了以下接口:javax.naming.event.NamingListener。从描述看来,它可以用于收听命名更改事件,如添加名称等。这是否适用于我的要求? –