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

如何获取java.rmi.Remote实例的状态,java,rmi,Java,Rmi,我有一个类a的实例,该类实现了java.rmi.Remote 为了检查到RMI服务器的连接的运行状况,我调用了a实例的一个定制的普通成员函数,并查看是否引发了异常。那可不是很优雅。因此,我的问题是: 是否有任何本机方法来检查连接是否可用于A实例上的方法调用,即无需实际尝试调用成员函数 一种特殊情况是:如果RMI服务器在客户端A实例的生存期内重新启动,则A实例将无效和失效(尽管服务器可能已备份且运行正常)。发件人: F.1客户端和客户端之间在什么时候有“实时”连接 服务器以及如何管理连接? 当客户

我有一个类
a
的实例,该类实现了
java.rmi.Remote

为了检查到RMI服务器的连接的运行状况,我调用了
a
实例的一个定制的普通成员函数,并查看是否引发了异常。那可不是很优雅。因此,我的问题是:

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

一种特殊情况是:如果RMI服务器在客户端
A
实例的生存期内重新启动,则
A
实例将无效和失效(尽管服务器可能已备份且运行正常)。

发件人:

F.1客户端和客户端之间在什么时候有“实时”连接 服务器以及如何管理连接?

当客户端执行“查找”操作时,将连接到 指定主机上的注册表。通常情况下,新连接可能会或 不能为远程调用创建。连接由 Java RMI传输供将来使用,因此如果连接到 远程呼叫的正确目的地,然后使用它。客户不能 显式关闭与服务器的连接,因为连接是 在Java RMI传输级别进行管理。如果出现以下情况,连接将超时: 它们有一段时间没有使用


您的问题:

  • 是否有任何本机方法来检查连接是否可用于 在实例上的方法调用,即不需要 实际尝试调用成员函数吗
  • 这个问题归结为如何以编程方式检查给定的服务器/系统是否已启动。这个问题已经在这里和其他几个论坛上得到了多次回答。回答这个问题的一个问题是

  • 一种特殊情况是:RMI服务器是否应在运行期间重新启动 客户端上的实例的生存期,然后是 A将变得无效和失效(尽管服务器可能已备份) 和健康)
  • 再说一次,答案很简单。如果该类的实例忙于执行远程方法调用中的某个步骤,则会立即引发与连接相关的异常

    再说一遍:

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

    考虑到绝对不可能立即确定 网络对等崩溃或变得不可用,您必须做出决定 当对等方停止响应时,应用程序应如何运行


    当客户端在远程方法上执行操作时,查找将一直正常工作,直到服务器启动,而不是停机。您必须在此处决定对等机重新启动时应用程序的行为。此外,RMI中没有会话这样的概念


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

    你的问题是建立在谬论基础上的

    提前知道状态对你一点帮助都没有。状态测试之后是一个计时窗口,随后是您对服务器的使用。在正时窗口期间,状态可以更改。测试时服务器可能会启动,使用时服务器可能会关闭。或者,当您测试时,它可能处于下降状态,而当您使用时,它可能处于上升状态

    确定任何资源是否可用的正确方法是尝试使用它。这适用于输入文件、RMI服务器、Web系统等

    如果RMI服务器在客户端A实例的生存期内重新启动,则A实例将变得无效和失效(尽管服务器可能已备份且运行正常)


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

    这不取决于您的代码吗?如果您的实例正在执行某项操作,但尚未返回,则立即无法执行另一个方法调用。正如它从上一次调用返回一样,它将处理其他方法调用。谢谢您的评论!对于我的问题,让我们假设实例没有忙着做某事,即没有陷入方法中。我的问题只与实例的连接状态有关。如果应用程序当前正在实例的范围内运行,那么是的,GC不会回收该对象。所以,我相信,您可以安全地假设该对象可用于执行其任何方法调用。所以,我将它标记为可能的副本的副本:?