【问题标题】:Java RMI connection brokenJava RMI 连接断开
【发布时间】:2021-07-30 18:24:56
【问题描述】:

我们有一个 java 客户端-服务器 RMI 应用程序。客户端通过以下方式执行调用:

public interface MyRemoteInterface extends java.rmi.Remote {
    public byte[] action(byte[] b}

public static Remote lookUp(String ip, int port, String alias) {
    return LocateRegistry.getRegistry(ip, port).lookup(alias)
}


 serverImpl = (MyRemoteInterface)lookUp(ip, rmpiport, alias);

 serverImpl.action(requestBytes);
 ..

它是一个经典的 rmi 客户端-服务器应用程序。当远程服务器接收到请求(调用)时,它会执行一些过程 P,这需要时间 T 然后返回。问题是,假设我们分别有两个客户端 C1 和 C2,每个客户端都是相同的(相同的操作系统、相同的 Java、没有防火墙、没有防病毒软件等)。 C1 和 C2 的区别在于它们位于不同的网络、不同的 ISP 提供等。例如,它们是两个用户,从家里连接,使用不同的服务提供商、调制解调器并连接到集中式服务器 S。 当进程 P 需要 4 分钟时,没有问题,两个客户端都收到响应。但是如果处理时间需要例如 10 分钟,C2 没有收到任何响应,服务器或客户端没有任何异常。 问题:造成这种差异的原因是什么?网络架构如何影响 rmi 连接的行为?我们可以通过设置一些超时参数或jvm-parameters来克服这个问题吗?我们没有在客户端或服务器上收到任何超时异常。如果处理时间变长,只是其中一个客户端不会收到任何响应。

【问题讨论】:

  • 如果连接真的断开了,你就会遇到异常。可能您的长期 RMI 方法中有一些长期同步,因此第二个调用者在第一个调用者运行时被阻塞。你可以回顾一下,但我同意@gusto2 的观点,即要避免长时间运行的远程方法。您还可以通过 RMI 系统属性对您的客户端施加响应超时。

标签: java rmi


【解决方案1】:

如果处理时间变长,只是其中一个客户端不会收到任何响应。

在我们的(企业)网络中,我们实施了一些政策来关闭长时间不活动的连接。所以可能会有差异。虽然客户端应该得到一个适当的例外。为了获得更好的答案,您可以收集有关网络级别的更准确信息(例如 tcpdump)

但如果处理时间需要例如 10 分钟

我不太喜欢远程执行时长时间运行的进程(不管协议如何)。主要是为了防止出现您问题中的问题。

您可以使用一些异步处理,例如启动服务器进程然后让客户端检查状态/结果的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多