我一直在使用RMI进行我正在进行的项目,并且我希望将多个主机绑定到单个RMI注册表。
然而,当我尝试这样做时,我收到错误
java.rmi.AccessException:不允许Registry.Registry.bind; origin / 192.168.0.9是非本地主机
我这样做谷歌搜索,似乎RMI默认停止远程主机绑定,我想知道有什么方法可以覆盖或绕过它吗?
如果有人就如何解决这个问题提出任何建议,我们会非常感激,我尝试过使用不同的策略文件并覆盖安全管理器,但似乎都没有。
答案 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发行版上运行时特别遇到此问题。