2009-11-30 11 views
10

Estoy construyendo un sistema distribuido utilizando Java RMI y debe soportar una pérdida del servidor.Java RMI - Tiempo de espera del cliente

Si mi cliente está conectado a un servidor usando RMI, si este servidor se cae (problemas de cable, por ejemplo), mi cliente debería obtener una excepción para poder conectarse a otro servidor.

Pero cuando el servidor se cae, no pasa nada a mi cliente, él sigue esperando la respuesta. ¿Cómo puedo establecer un tiempo de espera para eso?

Respuesta

7

Hay una propiedad del sistema que puede establecer.
Algo así como sun.rmi.transport.connectionTimeout

Se detallan aquí:
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/sunrmiproperties.html

+0

Thx, sería Helpa mucho! –

+0

Apols por brevedad e inexactitud; no Internet y iPhone son lentos ... –

+0

Estaba pensando que podría ser sun.rmi.transport.connectionTimeout. Pero el valor de descomposición es de 15 segundos. Mi cliente sigue esperando la respuesta por minutos .. =/ –

14

Para leer zócalo de tiempo de espera, puede configurar su propia fábrica de este tipo,

  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

Gracias ¡para esto! Exactamente lo que estaba buscando ... – Fortega

+0

Funciona perfectamente. Y no es necesario utilizar estos feos -D * trucos – Panayotis

+0

¡qué hack feo! Consulte la respuesta de @ Noky a continuación con un enfoque basado en la propiedad. – fommil

12

poco me encontré con este problema también y descubrí que necesitaba establecer la siguiente propiedad Java para que una llamada RMI expirara en el lado del cliente:

sun.rmi.transport.tcp.responseTimeout 

Aquí está la primicia sobre estos parametros en las últimas versiones de Java:

+1

Esto no funciona para mí. – ZhekaKozlov

Cuestiones relacionadas