我有几个服务,导出RMI接口。
他们用通过创建自己的注册表(与提供此LocateRegistry.createRegistry
),并有约束力的。 然而,这成为不可能当服务被转移到运行在相同的虚拟机(Tomcat)的作为单独的应用,因为某些原因只有一个注册表可以存在那里。
我工作围绕这通过使用一个中央注册表中的所有服务。 即使这样,我不是在注册表中的多对象注册表的角色很感兴趣,只是它的入口点设施。 一个中心登记,但是,引入了更多的复杂性(例如,它必须首先启动,它必须有服务的它注册接口)。
有没有一种方法带回每个服务提供自主承担切入点,以它的RMI接口的情况,同时让他们在同一个虚拟机上运行(这是一个托管的细节,而不是设计的一部分)?
我忘了,我问过类似的问题已经(出于不同的原因,减少了代码,之前我在1 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的顶部。