2009-11-30 8 views
10

Ich bin ein verteiltes System mit Java RMI erstellen und es muss einen Serververlust unterstützen.Java RMI - Client Timeout

Wenn mein Client über RMI mit einem Server verbunden ist, sollte der Server bei einem Ausfall dieses Servers (z. B. Kabelprobleme) eine Ausnahme erhalten, damit er eine Verbindung mit einem anderen Server herstellen kann.

Aber wenn der Server ausfällt, passiert nichts meinem Client, er wartet auf die Antwort. Wie kann ich ein Timeout dafür einstellen?

Antwort

7

Es gibt eine Systemeigenschaft, die Sie festlegen können.
So etwas wie sun.rmi.transport.connectionTimeout

Sie sind hier aufgeführt:
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/sunrmiproperties.html

+0

Thx, wäre es viel Helpa! –

+0

Apols für die Kürze und Ungenauigkeit; Kein Internet und iPhone wird langsam ... –

+0

Ich dachte, dass es die sun.rmi.transport.connectionTimeout sein könnte. Aber der Defaulf-Wert ist 15 Sekunden. Mein Client wartet auf die Antwort für Minuten .. =/ –

14

Für Socket lesen Timeout, können Sie Ihre eigene Fabrik wie folgt gesetzt werden,

  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

Danke dafür! Genau das, was ich gesucht habe ... – Fortega

+0

Funktioniert perfekt. Und keine Notwendigkeit, diese hässlichen -D * Tricks zu verwenden – Panayotis

+0

was für ein hässlicher Hack! Siehe @ Nokys Antwort unten mit einem eigenschaftsbasierten Ansatz. – fommil

12

ich dieses Problem auch vor kurzem festgestellt und Ich habe festgestellt, dass ich die folgende Java-Eigenschaft festlegen musste, damit ein RMI-Aufruf auf der Clientseite eine Zeitüberschreitung verursacht:

sun.rmi.transport.tcp.responseTimeout 

Hier ist die volle Schaufel auf diesem params in neueren Versionen von Java:

+1

Das funktioniert nicht für mich. – ZhekaKozlov