Java RMI - 客户端超时

时间:2009-11-30 22:01:01

标签: java timeout rmi

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

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

但是当服务器出现故障时,我的客户端没有任何反应,他一直在等待回复。如何为此设置超时?

5 个答案:

答案 0 :(得分:15)

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

           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 );
                }
            } );

答案 1 :(得分:12)

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

sun.rmi.transport.tcp.responseTimeout

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

答案 2 :(得分:7)

您可以设置系统属性 像sun.rmi.transport.connectionTimeout

这样的东西

这里详述:
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/sunrmiproperties.html

答案 3 :(得分:0)

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

Creating a Custom RMI Socket Factory

答案 4 :(得分:-1)

tomcat配置:转到vmoptions设置-Dsun.rmi.transport.tcp.responseTimeout = 30000(毫秒)

websphere配置:转到“通用JVM参数”部分中的“应用程序服务器> server1>进程定义> Java虚拟机集-Dsun.rmi.transport.tcp.responseTimeout = 30000