为什么RMI注册表需要我的远程接口类文件?

时间:2015-01-06 00:10:20

标签: java rmi

之前曾问过这个问题(粗略地说)。它有一个答案需要澄清。澄清请求的答案是无响应的。

我编写一个远程接口RX并开发实现“类RXImpl实现RX”。在我的RMI服务器中,我实例化并导出RXImpl,在此过程中获取存根:

RXImpl obj  = new RXImpl();
RX     stub = (RX)UnicastRemoteObject.exportObject( obj, 0 );

我的理解(当然可能是错误的)是所有的辛勤工作都已完成。我只是需要一些方法告诉潜在客户在哪里找到存根,我用注册表来做:

Registry registry = LocateRegistry.getRegistry();
registry.rebind( "rmi:some_arbitrary_name", stub );

但是如果注册表在其代码库中找不到RX.class,我会得到一个带有嵌套异常“ClassNotFoundException:RX”的RemoteException。

如果所有注册表需要做的是告诉客户端现有存根的存在,为什么它需要一个包含RX.class的代码库?

感谢。

1 个答案:

答案 0 :(得分:1)

  

如果所有注册表需要做的是告诉客户现有存根的存在

这不是一个准确的描述。 Registry基本上是一个远程哈希表,它将绑定名称映射到存根。它不会“告诉客户端是现有的存根”,它通过RMI将返回存根作为对象。存根不会在其他地方“存在”,它们在注册表的哈希映射中,已经通过绑定步骤放在那里,也通过RMI。

  

为什么它需要一个包含RX.class的代码库?

因为,as you have already been told,注册表是一个RMI服务器,因此它遵循与所有其他RMI组件相同的规则。