Java RMI 连接断开

问题描述

我们有一个 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 来克服这个问题吗?我们没有在客户端或服务器上收到任何超时异常。如果处理时间变长,只是其中一个客户端不会收到任何响应。

解决方法

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

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

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

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

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