2

我有几个导出 RMI 接口的服务。

他们过去通过创建自己的注册表(使用LocateRegistry.createRegistry)并将其绑定在那里来提供此功能。然而,当服务被转移到在同一个虚拟机(Tomcat)中作为单独的应用程序运行时,这变得不可能了,因为由于某种原因,那里只能存在一个注册表。

我通过为所有服务使用中央注册表来解决这个问题。即便如此,我对注册表的多对象注册表角色并不真正感兴趣,只是它的入口点设施。然而,中央注册中心引入了更多的复杂性(例如,它必须首先启动,它必须具有它注册的服务的接口)。

有没有办法恢复每个服务独立提供其 RMI 接口的入口点的情况,同时让它们在同一个 VM 中运行(这是托管细节,不是设计的一部分)?

4

3 回答 3

0

我忘记了我已经问过一个类似的问题(出于不同的原因,减少代码,在我将服务一起移动到一个 VM 之前),其中第一个答案建议了一种绕过注册表的方法:

使用 UnicastRemoteObject,将导出对象时获得的存根序列化,并使用共享文件、套接字或sneakernet 使存根对客户端可用。

于 2012-07-09T16:43:09.053 回答
0

如果一年后你仍然对这个问题感兴趣......

可以在同一个 JVM 中启动多个注册表。只需调用LocateRegistry.getRegistry不同的端口即可。您必须为每个服务拥有众所周知的端口,但我认为如果您已经实施了从这个答案到另一个问题的选项 3,那么您已经在这样做了。

很久以前有一个错误会阻止多个注册表共存于同一个 JVM 中,但在 JDK 5 中已修复。Tomcat 中可能存在阻止多个 RMI 注册表运行的问题。或者,您使用的 Tomcat 版本可能位于非常旧的 JDK 之上。

于 2013-08-15T06:30:40.767 回答
0

每个 JVM 不能有多个 Registry,因为 Registry 有一个固定的 RMI 对象 ID。只需调整所有服务器以像这样开始:

static Registry registry;
// ...
try
{
  registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
}
catch (...) // whatever the exception is, probably ExportException
{
  registry = LocateRegistry.locateRegistry(Registry.REGISTRY_PORT);
}
registry.rebind(...); // etc

然后他们中的任何一个先启动将启动注册表,其他人将使用它。

于 2012-07-09T23:37:44.293 回答