【问题标题】:Java RMI - Is registry.bind blocking and how can server know if Client is downJava RMI - registry.bind 是否阻塞以及服务器如何知道客户端是否已关闭
【发布时间】:2014-11-22 07:24:28
【问题描述】:

我有两个关于 Java RMI 的单独问题,在一个简单的 hello-world 客户端-服务器应用程序中使用 RMI,http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/hello/hello-world.html

(1) 在Server代码中,是registry.bind("Hello", stub);阻塞呼叫? 我希望最终使我的程序点对点,所以我需要我的服务器在导出接口后继续。导出界面后,有没有办法在我的服务器主服务器中继续执行?

(2) 在服务器上执行的远程方法中,我返回一个字符串。假设我的客户端在服务器上的远程方法想要返回之前崩溃。我可以在我的服务器远程方法中检测到这一点吗?具体可以在远程方法中使用 -

..
try {
return str;
} catch (Exception e) { 
    System.err.println("Client seems to be down so cannot return"); return str; 
}

以上大致是我想要实现的,似乎没有触发异常: (a) 我需要抛出特定类型的异常吗? http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/rmi/spec/rmi-exceptions.doc.html (b) 如果这甚至可以工作,我仍然需要在 catch {} 块中返回一些内容,以免出现编译错误。这似乎在逻辑上不正确。

我可以做相反的事情,即在客户端我收到一个异常是服务器崩溃,所以我的远程方法无法返回,但在这里我需要在服务器中检测客户端是否在服务器中的远程方法返回之前已经死亡。

【问题讨论】:

    标签: java rmi rpc


    【解决方案1】:

    (1) 在Server代码中,是registry.bind("Hello", stub);阻塞呼叫?我希望最终使我的程序点对点,所以我需要我的服务器在导出接口后继续。导出界面后,有没有办法在我的服务器主程序中继续执行?

    在调用期间它是阻塞的,但所有调用本质上都是 HashMap.add() 和一些错误检查。它不会阻止在发生外部事件时继续执行代码,就像 accept() 所做的那样。

    (2) 在服务器上执行的远程方法中,我返回一个字符串。假设我的客户端在服务器上的远程方法想要返回之前崩溃。我可以在我的服务器远程方法中检测到这一点吗?具体可以在远程方法中使用吗

    没有。 RMI 框架可能会在您的 return 语句执行后检测并处理这种情况,但不会告诉您这件事。它将记录问题并关闭连接。

    我需要在服务器中检测客户端是否在服务器中的远程方法返回之前已经死亡。

    你不能。 RMI 提供的了解消失客户端的唯一方法是 Unreferenced 接口。

    【讨论】:

    • 谢谢,但如果可能的话,你能帮助我更详细地理解吗? (1) 什么是“在通话期间”阻塞 - 在 hello-world 示例中,服务器似乎无限期阻塞(System.out.println 在它之后没有被执行)。我目前已将导出和绑定调用放在与 main() 分开的线程中,但仍想知道在这些调用之后如何继续执行。为什么 Hashmap.Add() 会这样做,我需要把它放在哪里 - 没有得到这个概念。
    • (2) 当持有对我的远程方法的引用的客户端数量变为 0 时,似乎实现 unreferenced 将调用一个方法。然后我可以在服务器上检查有多少客户端从完整列表。这是这个主意吗?如果是这样,为什么在任何客户端尝试连接到远程方法之前最初没有触发呢?当我在服务器方法正在执行时杀死客户端时,它现在对我不起作用,所以一些示例可能会有所帮助。 coderanch.com/t/183723/java-developer-SCJD/certification/…
    • @PKM 如果打印方法在bind 之后没有执行,那么有问题。这可能是一个永远不会超时的连接问题。正如 EJP 所说,代码执行在方法调用期间可能会暂停一点,但在完成后不会。
    • @PKM 客户端持有对远程对象的引用,而不是对远程方法的引用。当unreferenced 被调用时,可能所有的客户端都关闭了。
    • @PKM TCP 的本质是你描述的情况直到之后才能被检测到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2014-08-19
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多