2009-11-30 20 views
10

私はJava RMIを使用して分散システムを構築しています。Java RMI - クライアントタイムアウト

クライアントがRMIを使用してサーバーに接続されている場合、このサーバーがダウンすると(ケーブルの問題など)、クライアントは例外を取得して他のサーバーに接続できます。

しかし、サーバーがダウンすると、クライアントに何も起こりません。彼は応答を待っています。タイムアウトを設定するにはどうすればよいですか?

答えて

7

設定できるシステムプロパティがあります。 sun.rmi.transport.connectionTimeout

よう
何か彼らがここで詳述されている:私は最近、同様にこの問題が発生したソケットの読み込みタイムアウトのために
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/sunrmiproperties.html

+0

Thxを、それは多くのことをhelpaう! –

+0

簡潔さと不正確さのためのApols;いいえインターネットとiPhoneが遅い... –

+0

私はそれがsun.rmi.transport.connectionTimeoutかもしれないと思っていた。 defaulf値は15秒です。私のクライアントは分の応答を待っています。=/ –

14

を、あなたはこのような独自の工場を設定することができ、

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

ありがとうこのため!正確に私が探していたもの... – Fortega

+0

完璧に動作します。これらの醜い-D *トリックを使用する必要はありません – Panayotis

+0

どのような醜いハック!以下の@ Nokyの答えをプロパティベースのアプローチで見てください。 – fommil

12

とRMI呼び出しがクライアント側でタイムアウトするために、次のJavaプロパティを設定する必要があることがわかりました。

ここ

は、Javaの新しいバージョンではこれらのparamsで完全スクープです:

+1

これは私のためには機能しません。 – ZhekaKozlov