我有几个导出RMI接口的服务。
他们曾经通过创建自己的注册表(使用LocateRegistry.createRegistry
)并将其绑定在那里来提供此功能。但是,当服务被移动为在同一个VM(Tomcat)中作为单独的应用程序运行时,这变得不可能,因为由于某种原因,那里只能存在一个注册表。
我通过使用所有服务的中央注册表解决了这个问题。即便如此,我对注册表的多对象注册表角色,只是它的入口点设施并不感兴趣。但是,中央注册表引入了更多的复杂性(例如,它必须首先启动,它必须具有它注册的服务接口)。
有没有办法让每个服务独立提供其RMI接口的入口点,同时让它们在同一个VM中运行(这是托管详细信息,而不是设计的一部分)?
答案 0 :(得分:0)
我忘记了我已经问过a similar question(出于不同的原因,减少代码,在我将服务放在一个VM中之前),第一个答案建议绕过注册表:
使用UnicastRemoteObject,序列化导出时获得的存根 对象,并使用共享文件,套接字或sneakernet来制作 存根可供客户使用。
答案 1 :(得分:0)
每个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
然后,无论哪一个首先启动都将启动注册表,其他人将使用它。
答案 2 :(得分:0)
如果你在一年后仍对这个问题感兴趣......
可以在同一JVM中启动多个注册表。只需使用不同的端口呼叫LocateRegistry.getRegistry
即可。你必须拥有每个服务的知名端口,但如果你已经从this answer to the other question实现了选项3,我认为你已经这样做了。
很久以前,有一个错误导致多个注册表无法在同一个JVM中共存,但这在JDK 5中已得到修复.Tomcat中可能存在一些阻止多个RMI注册表运行的错误。或者,可能是您使用的Tomcat版本是在一个非常古老的JDK之上。