Java RMI连接已断开

Java RMI连接已断开,java,rmi,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).lo

我们有一个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提供等。例如,它们是两个从家中连接的用户,使用不同的服务提供商、调制解调器并连接到集中服务器。 当进程P花费4分钟时,没有问题,两个客户端都会收到响应。但是,如果处理时间为10分钟,C2将不会收到响应,服务器端或客户端不会出现任何异常。 问题:造成这种差异的原因是什么?网络体系结构如何影响rmi连接的行为?我们可以通过设置一些超时参数或jvm参数来克服这个问题吗?我们在客户端或服务器上没有任何超时异常。如果处理时间变长,其中一个客户机不会收到任何响应

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

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

但如果处理时间为10分钟

我并不喜欢远程执行时长时间运行的进程(不管协议如何)。主要是为了防止像你问题中那样的问题


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

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