8

我一直在将 RMI 用于我目前正在处理的项目,并且我想从多个主机绑定到单个 RMI 注册表。

但是,当我尝试这样做时,我收到一条错误消息

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

我做了谷歌搜索,似乎 RMI 默认情况下会阻止远程主机绑定,我想知道是否有某种方法可以覆盖或绕过它?

如果有人对如何解决这个问题有任何建议,他们将不胜感激,我尝试使用不同的策略文件并覆盖安全管理器,但似乎没有一个工作。

4

5 回答 5

7

有一种方法可以绕过限制,但它就是这样:一种解决方法。无论如何,请随意尝试。它对我们有用。

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

所有其他主机将简单地查找此远程对象并使用它们自己的远程对象调用 proxyRebind。

这是可行的,因为允许在远程托管的注册表上进行查找。您最初的尝试失败了,因为不允许绑定到远程托管的注册表。

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

/RS

于 2009-05-19T20:07:35.830 回答
2

2 有一种方法可以绕过限制,但它就是这样:一种变通方法。无论如何,请随意尝试。它对我们有用。

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

所有其他主机将简单地查找此远程对象并使用它们自己的远程对象调用 proxyRebind。

这是可行的,因为允许在远程托管的注册表上进行查找。您最初的尝试失败了,因为不允许绑定到远程托管的注册表。

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

这非常有效。唯一需要注意的是应始终正确设置跟随。-Djava.rmi.server.hostname="本地主机IP"

于 2009-08-30T15:54:16.990 回答
1

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

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

我们无法让我们的项目在大学网络之外运行,但它们在直接连接到网络时运行良好。根据我们的教授的说法,在我们通过 Internet 或 WAN 的实现中不可能使用 RMI。她建议的解决方案是需要 VPN。我相信 Vladimir 是正确的,因为它与本地命名服务有关。

于 2009-05-19T19:16:33.687 回答
0

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

您需要的是一个命名实现,并聚集在此。考虑转入 J2EE AS 集群解决方案。JNDI 树在集群内共享。

于 2009-05-04T17:58:04.410 回答
0

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

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

于 2009-06-14T15:15:10.673 回答