我有一个第三方Java库我试图用RMI封装在一个单独的JVM中(因为该库具有使JVM崩溃的本机调用,并且有应用程序在另一台机器上运行RMI服务器)。
客户端上的我的Java应用程序就像这样工作,至少当所有东西都运行在同一台机器上时:
FooBar/<id>
的对象FooBar/<id>
的对象我遇到的问题是,当其他JVM崩溃时,它似乎让绑定存在于RMI注册表中,然后我最终使用了一个连接到任何东西的幻像对象。
有没有办法可以在某种程度上检查绑定到RMI注册表的代理对象在步骤2中,所以如果对象无效,我可以创建一个新的重新绑定()到RMI注册表?
答案 0 :(得分:3)
为您的rmi请求设置超时(请参阅here)。然后,如果请求超时,请考虑对象死机。另外,当我想要非常可靠的rmi代码时,我将在客户端包装rmi调用,具有某种重试/退避功能(假设您的传出呼叫是幂等的)。因此,在考虑目标对象死亡之前,您会尝试连接几次延迟。
(不,没有办法确定远程对象是否已经死亡而没有尝试联系它。)