问题描述
|
我有一个第三方Java库,我正在尝试用RMI封装在单独的JVM中(因为该库具有使JVM崩溃的本机调用,并且有用于在另一台计算机上运行RMI服务器的应用程序)。
至少在所有内容都在同一台计算机上运行时,客户端上的Java应用程序都是这样工作的:
在RMI注册表中找到绑定到“ 0”的对象
如果它已经绑定到注册表,请使用它并转到步骤5。
否则,请启动一个单独的JVM来创建有问题的对象。
等待短暂的超时
在RMI注册表中找到绑定到“ 0”的对象
如果我们有目标,那就成功! (否则失败)
我的问题是,当另一个JVM崩溃时,似乎将绑定保留在RMI注册表中,然后我最终使用了一个未连接的幻像对象。
有没有办法在步骤2中以某种方式检查绑定到RMI注册表的代理对象,因此,如果该对象无效,我可以创建一个新对象来将rebind()绑定到RMI注册表?
解决方法
为您的rmi请求设置超时(请参见此处)。如果请求超时,则认为该对象已死。另外,当我想要非常可靠的rmi代码时,我将使用某种重试/退避功能将rmi调用包装在客户端(假设您的传出呼叫是幂等的)。因此,在考虑目标对象失效之前,您应尝试进行几次连接,并之间进行延迟。
(没有,没有尝试联系它就无法确定远程对象是否死亡的方法)。