单一RMI服务的简单入口点?

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

他们曾经通过创建自己的注册表(使用LocateRegistry.createRegistry )并在那里绑定它来提供此function。 但是,当服务作为单独的应用程序在同一个VM(Tomcat)中运行时,这变得不可能,因为由于某种原因,那里只能有一个注册表。

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

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

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

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

每个JVM不能有多个注册表,因为注册表具有固定的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 

然后,无论哪一个首先启动将启动注册表,其他人将使用它。

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

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

很久以前,有一个错误阻止多个注册表在同一个JVM中共存,但这在JDK 5中得到修复.Tomcat中可能存在阻止多个RMI注册表运行的内容。 或者,可能是您使用的Tomcat版本是在一个非常古老的JDK之上。