Java RMI:如何检测服务器是否崩溃?

问题描述

| 我有一个第三方Java库,我正在尝试用RMI封装在单独的JVM中(因为该库具有使JVM崩溃的本机调用,并且有用于在另一台计算机上运行RMI服务器的应用程序)。 至少在所有内容都在同一台计算机上运行时,客户端上的Java应用程序都是这样工作的: 在RMI注册表中找到绑定到“ 0”的对象 如果它已经绑定到注册表,请使用它并转到步骤5。 否则,请启动一个单独的JVM来创建有问题的对象。 等待短暂的超时 在RMI注册表中找到绑定到“ 0”的对象 如果我们有目标,那就成功! (否则失败) 我的问题是,当另一个JVM崩溃时,似乎将绑定保留在RMI注册表中,然后我最终使用了一个未连接的幻像对象。 有没有办法在步骤2中以某种方式检查绑定到RMI注册表的代理对象,因此,如果该对象无效,我可以创建一个新对象来将rebind()绑定到RMI注册表?     

解决方法

为您的rmi请求设置超时(请参见此处)。如果请求超时,则认为该对象已死。另外,当我想要非常可靠的rmi代码时,我将使用某种重试/退避功能将rmi调用包装在客户端(假设您的传出呼叫是幂等的)。因此,在考虑目标对象失效之前,您应尝试进行几次连接,并之间进行延迟。 (没有,没有尝试联系它就无法确定远程对象是否死亡的方法)。