【问题标题】:RMI server 25 second timeout when remote client connection is severed远程客户端连接断开时,RMI 服务器 25 秒超时
【发布时间】:2017-10-25 00:08:13
【问题描述】:

我有一个远程客户端无线连接的 RMI 服务器。一切都很好,直到无线连接被切断。我的 RMI 服务器检测到它没有收到来自客户端的 ping 并执行对客户端的 ping,该客户端引发异常,然后我会处理该异常。问题是抛出此异常大约需要 25 秒,因此 RMI 服务器在抛出异常之前不会响应来自其他连接客户端的任何请求。

我已经搜索了几天,将客户端和服务器上的属性设置为connectionTimeout, responseTimeout, disableHttp,但没有成功。希望有人能帮我指明方向,以确保我的网络。

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    与此相关的唯一Sun RMI system propertiessun.rmi.transport.tcp.responseTimeout 可能还有sun.rmi.transport.tcp.readTimeout,您需要在导出任何远程对象之前设置它们。

    但是我质疑你的诊断。 RMI 运行时系统和 RMI 服务器都不是单线程的,因此 25 秒的延迟不会阻碍其他客户端。

    因此,如果您遇到客户端停顿,这不是 RMI 的错。可能是网络堆栈行为不端。

    我进一步质疑你的整个策略。 RMI 使用连接池,而不是永久连接:ping 服务器和客户端的想法完全违背了 RMI 的理念,并且浪费了连接。我会摆脱所有这些 ping,并在它们出现时处理java.rmi.ConnectExceptions。您可以通过该页面上的其他系统属性稍微控制连接寿命。

    如果您正在寻找检测消失客户端的解决方案,有更好的解决方案:请参阅 this answerthis one

    【讨论】:

    • 我的客户端在服务器上执行一个远程方法来通知客户端连接到服务器。感谢您抽出宝贵时间提供反馈。您能否指出一个强大的 RMI 客户端/服务器握手示例的方向,以便在服务器在 30 秒等合理时间范围内不再连接时通知客户端?
    • 客户端没有连接到服务器,除了远程调用的持续时间和连接池在此之后保持连接的时间。 RMI 故意向您隐藏 TCP 连接,因此谈论正在连接的客户端或服务器是不合适或没有意义的。在此处搜索远程会话模式,并使用Unreferenced 接口检测客户端“断开连接”。
    • 非常感谢,刚刚订购了您的书,您的简历令人印象深刻,希望与您通信的人感谢您提供的建议和直截了当的支持。
    • @MAB 非常感谢。
    • 我今天收到了您的书,并询问是否有工作站点可以下载代码和/或任何基于会话的服务器的完整示例?书中的链接无效 www.aw.com/cseng/titles/0-20170043-3
    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多