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

时间:2011-04-13 20:20:06

标签: java rmi

我有一个第三方Java库我试图用RMI封装在一个单独的JVM中(因为该库具有使JVM崩溃的本机调用,并且有应用程序在另一台机器上运行RMI服务器)。

客户端上的我的Java应用程序就像这样工作,至少当所有东西都运行在同一台机器上时:

  1. 在RMI注册表中找到绑定到FooBar/<id>的对象
  2. 如果它已经绑定到注册表,请使用它并转到步骤5.
  3. 否则,启动一个单独的JVM来创建相关对象。
  4. 等待短暂的超时
  5. 在RMI注册表中找到绑定到FooBar/<id>的对象
  6. 如果我们有一个对象,成功! (否则失败)
  7. 我遇到的问题是,当其他JVM崩溃时,它似乎让绑定存在于RMI注册表中,然后我最终使用了一个连接到任何东西的幻像对象。

    有没有办法可以在某种程度上检查绑定到RMI注册表的代理对象在步骤2中,所以如果对象无效,我可以创建一个新的重新绑定()到RMI注册表?

1 个答案:

答案 0 :(得分:3)

为您的rmi请求设置超时(请参阅here)。然后,如果请求超时,请考虑对象死机。另外,当我想要非常可靠的rmi代码时,我将在客户端包装rmi调用,具有某种重试/退避功能(假设您的传出呼叫是幂等的)。因此,在考虑目标对象死亡之前,您会尝试连接几次延迟。

(不,没有办法确定远程对象是否已经死亡而没有尝试联系它。)

相关问题