2009-11-30 24 views
10

Sto costruendo un sistema distribuito utilizzando Java RMI e deve supportare una perdita del server.Java RMI - Timeout client

Se il mio client è connesso a un server che utilizza RMI, se questo server si arresta (problemi di cavo, ad esempio), il mio client dovrebbe ricevere un'eccezione in modo che possa connettersi ad altri server.

Ma quando il server si arresta, non succede nulla al mio cliente, continua ad aspettare la risposta. Come posso impostare un timeout per questo?

risposta

7

Esiste una proprietà di sistema che è possibile impostare.
Qualcosa come sun.rmi.transport.connectionTimeout

siano dettagliati qui:
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/sunrmiproperties.html

+0

Thx, sarebbe Heľpa sacco! –

+0

Apols per brevità e imprecisione; no Internet e iPhone sono lenti ... –

+0

Stavo pensando che potrebbe essere il sun.rmi.transport.connectionTimeout. Ma il valore di default è 15 secondi. Il mio cliente continua ad attendere la risposta per minuti .. =/ –

14

Per presa leggere timeout, è possibile impostare il proprio stabilimento come questo,

  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

Grazie per questo! Esattamente quello che stavo cercando ... – Fortega

+0

Funziona perfettamente. E non c'è bisogno di usare questi brutti trucchi MrGreen – Panayotis

+0

che brutto scherzo! Vedi la risposta di @ Noky sotto con un approccio basato sulla proprietà. – fommil

12

Recentemente ho incontrato questo problema come bene e trovato che avevo bisogno di impostare la seguente proprietà Java in ordine per una chiamata RMI al timeout sul lato client:

sun.rmi.transport.tcp.responseTimeout 

Ecco il pieno scoop su questi params nelle nuove versioni di Java:

+1

Questo non funziona per me. – ZhekaKozlov