使用单个RMI注册表

时间:2009-05-04 16:05:32

标签: java exception networking distributed rmi

我一直在使用RMI进行我正在进行的项目,并且我希望将多个主机绑定到单个RMI注册表。

然而,当我尝试这样做时,我收到错误

java.rmi.AccessException:不允许Registry.Registry.bind; origin / 192.168.0.9是非本地主机

我这样做谷歌搜索,似乎RMI默认停止远程主机绑定,我想知道有什么方法可以覆盖或绕过它吗?

如果有人就如何解决这个问题提出任何建议,我们会非常感激,我尝试过使用不同的策略文件并覆盖安全管理器,但似乎都没有。

5 个答案:

答案 0 :(得分:7)

有一种解决限制的方法,但它就是这样:一种解决方法。无论如何,请随意尝试。它适用于我们。

在运行中央RMI注册表的主机上运行一个小服务,该服务只使用一个远程方法绑定远程对象:proxyRebind。此方法的实现只是绑定在中央注册表中提供给它的对象(这不会失败,因为注册表与此服务在同一台机器上)。

所有其他主机只需查找此远程对象并使用自己的远程对象调用proxyRebind。

这是有效的,因为允许在远程托管的注册表上进行查找。您的原始尝试失败,因为不允许绑定远程托管的注册表。

如果您需要进一步澄清,请告诉我。

/ RS

答案 1 :(得分:2)

  

2有办法绕行   限制,但它是什么:a   变通。无论如何,请随意尝试   出来。它适用于我们。

     

在正在运行的主机上   中央RMI注册表运行一小部分   将绑定远程的服务   只有一个远程方法的对象:   proxyRebind。实施   这个方法只是绑定对象   在中央供应给它   注册表(这不会失败,因为   注册表与...在同一台机器上   这项服务)。

     

所有其他主机都只是查找   这个远程对象并调用   proxyRebind与他们自己的遥控器   对象。

     

这是有效的,因为远程查找   允许托管注册管理机构。您的   原始尝试失败,因为   绑定远程托管的注册表   是不允许的。

     

如果您还需要,请告诉我   清楚这一点。

这完美有效。唯一需要注意的是应始终正确设置。 -Djava.rmi.server.hostname =“LOCAL HOST IP”

答案 2 :(得分:1)

我可能误解了你的问题,如果有,请告诉我。

我对Java RMI的经验有限,我们在带有代理模式的Design Patterns类中使用它。 (教科书:头部设计模式)

我们无法让我们的项目在大学网络外部工作,但是当它们直接连接到网络时,它们工作得很好。根据我们的教授的说法,在我们通过互联网或实施的实施中使用RMI是不可能的。她建议的解决方案是需要VPN。我相信弗拉基米尔是正确的,因为它与本地命名服务有关。

答案 3 :(得分:0)

我可能错了,但看起来rmiregistry应用程序本质上是本地命名服务的包装器。这意味着没有办法让它指向远程对象。

您需要的是命名实现,并在此处进行聚类。考虑进入J2EE AS集群解决方案。 JNDI树在集群中共享。

答案 4 :(得分:0)

感谢大家回答我最终提出的解决方案是使用Cajo Framework这提供了一个非常灵活的分发系统,它允许我按照我认为合适的方式处理注册表。它也可以在NAT,防火墙和HTTP代理之后工作,这非常有用。

我认为rndm.buoy建议的代理方法在某些情况下会起作用,但在某些系统上可能会很麻烦。 RMI似乎在与错误的网络接口相关联时存在一些问题我在基于Debian的Linux发行版上运行时特别遇到此问题。