如何获取java.rmi.Remote实例的状态



我有一个实现java.rmi.Remote的类A的实例。

为了检查到RMI Server的连接的运行状况,我调用了A实例的一个定制的、简单的成员函数,看看是否抛出了一个Exception。这不是很优雅。所以我的问题是:

是否有任何本地方法来检查连接是否可用于A实例上的方法调用,即不需要实际尝试调用成员函数?

一种特殊情况是:如果RMI服务器在客户端A实例的生命周期内重新启动,那么A实例将变得无效并失效(尽管服务器可能备份并运行正常)。

从Java RMI FAQ:

F.1在什么情况下,客户端和服务器之间存在"实时"连接服务器和如何管理连接?

当客户端执行"查找"操作时,将建立到指定主机上的Rmiregistry。一般来说,一个新的连接可能或不能为远程调用创建。类缓存连接Java RMI传输以供将来使用,所以如果一个连接是免费的远程调用的正确目的地,然后使用它。客户端不能显式地关闭到服务器的连接,因为连接是在Java RMI传输级别进行管理。连接将超时,如果它们在一段时间内不使用。


你的问题:

  1. 是否有任何本地方法来检查连接是否可用方法在A的实例上调用,即不需要实际上尝试调用一个成员函数?

这个问题归结为如何通过编程检查给定的服务器/系统是否UP。这个问题已经在这里和其他论坛上被回答了好几次。一个这样的问题,回答这个问题是检查服务器是否在线从Java代码。

  • 一个特殊的情况是:RMI服务器应该在的实例的生命周期,然后是的实例的生命周期A变为无效并失效(尽管服务器可能已备份)和健康)。
  • 再一次,答案很简单。如果类的实例忙于执行远程方法调用中的某个步骤,则会立即抛出与连接相关的异常。

    还是来自RMI FAQ, D.8为什么当客户端崩溃时我不能得到即时通知?:

    如果TCP连接在客户端和服务器之间保持打开状态在整个交互过程中,服务器可以检测到客户端当稍后尝试写入连接时,重新启动(我在这里添加:反之亦然)失败(包括每小时TCP keepalive数据包,如果启用)。然而,Java RMI的设计不需要这种永久性客户机和服务器(或对等体)之间的永久连接,因为它会损坏可伸缩性和没有多大帮助。

    考虑到绝对不可能立即确定a网络对等点崩溃或变得不可用,您必须做出决定当一个对等端停止响应时,你的应用程序应该如何表现。


    查找将继续完美地工作,直到服务器UP并且在客户端对远程方法执行操作时不停机。您必须在这里决定如果对等端重新启动,您的应用程序应该如何表现。此外,在RMI中没有会话这样的概念。

    我希望这能回答你所有的问题。

    你的问题是建立在一个谬误之上的。

    提前知道现状对你一点帮助都没有。状态测试之后是一个计时窗口,然后是您对服务器的使用。在定时窗口内,状态可以改变。测试时服务器可能是启动的,使用时服务器可能是关闭的。也可以在测试时下降,在使用时上升。

    判断是否有资源可用的正确方法是尝试使用它。这适用于输入文件,RMI服务器,Web系统,…

    如果RMI服务器在客户端A实例的生命周期内重新启动,则A的实例将失效并停止运行(尽管服务器可能已备份且运行正常)。

    在这种情况下,您将获得java.rmi.ConnectExceptionjava.rmi.NoSuchObjectException,这取决于远程对象是在不同端口上重启还是在相同端口上重启。

    最新更新