14

我正在使用 Java RMI 构建分布式系统,它必须支持服务器丢失。

如果我的客户端使用 RMI 连接到服务器,如果该服务器出现故障(例如电缆问题),我的客户端应该得到一个异常,以便它可以连接到其他服务器。

但是当服务器宕机时,我的客户端什么也没有发生,他一直在等待回复。我该如何设置超时?

4

4 回答 4

16

对于套接字读取超时,您可以像这样设置自己的工厂,

           RMISocketFactory.setSocketFactory( new RMISocketFactory()
            {
                public Socket createSocket( String host, int port )
                    throws IOException
                {
                    Socket socket = new Socket();
                    socket.setSoTimeout( timeoutMillis );
                    socket.setSoLinger( false, 0 );
                    socket.connect( new InetSocketAddress( host, port ), timeoutMillis );
                    return socket;
                }

                public ServerSocket createServerSocket( int port )
                    throws IOException
                {
                    return new ServerSocket( port );
                }
            } );
于 2009-11-30T22:12:03.000 回答
13

我最近也遇到了这个问题,发现我需要设置以下 Java 属性才能使 RMI 调用在客户端超时:

sun.rmi.transport.tcp.responseTimeout

以下是 Java 较新版本中这些参数的完整独家新闻:

于 2012-10-16T18:57:59.000 回答
9

您可以设置一个系统属性。
就像是sun.rmi.transport.connectionTimeout

它们在此处详细说明:
https ://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html

于 2009-11-30T22:04:23.440 回答
0

您可以使用自定义套接字工厂。它工作正常,它不是静态的,不推荐使用,并且不符合系统属性,它不适用于整个 JVM。但关键是代码在服务器端。

创建自定义 RMI 套接字工厂

于 2018-10-28T08:56:49.070 回答