2012-09-13 51 views
10

Estoy tratando de hacer una llamada a un proceso de trabajo muy pesado. Su longitud de trabajo promedio se estima en 9-10 minutos.Java: tiempo de espera de lectura de socket excepción

Cuando estoy ejecutando el proceso, establecer el tiempo de espera para un número ridículamente enorme: 99999999.

Después de 2 minutos, me sale el siguiente error:

java.net.SocketTimeoutException: Read timed out

Me trataron de meterse con es algo más, y configuré el tiempo de espera en 3000, y después de 3 segundos como anticipé recibí el mismo error.

¿Tiene alguna idea sobre por qué socket.setSoTimeout(99999999) lo establece en 120000 max?

+3

Este método se transfiere al sistema operativo, por lo que el funcionamiento de este método depende de su sistema operativo. ¿Qué versión del SO estás usando? –

+1

¿Ha intentado enviar mensajes de mantener vivo o hacer que el proceso lo "llame" de vuelta cuando se haya completado en lugar de mantener un socket abierto durante años? – Thor84no

+1

Parece que el sistema operativo simplemente rechaza su valor porque si está fuera de rango. Intentaría jugar con valores más altos pero no tan altos (lo está configurando en más de 27 horas). v.g., 3 minutos, 5 minutos, 10 minutos. – SJuan76

Respuesta

2

Tuve el mismo problema y la solución no fue usar socket.shutdownInput(); socket.shutDownOutput(); hasta la última vez que se leen o escriben datos en el socket. Esto hizo que el socket pasara al estado FIN_WAIT esperando 2 minutos antes del cierre. Puede obtener más información al respecto en this post

+0

Esta técnica no puede resolver una excepción de tiempo de espera de lectura. – EJP

+0

Si se tomó el tiempo para ejecutar mi caso de prueba, habría visto que esta es la solución. y puedes probarlo tú mismo, escribir algunas entradas en un socket y usar 'shutdownInput' y verás que el socket cambiará al estado FIN_WAIT. espere 2 minutos y verá que el socket está cerrado. – Rotem

+1

Gracias asigna Rotem, eso funcionó! :) – Urbanleg

1

No estoy seguro de cómo funciona su aplicación, pero trato de establecer un infinito timeout to the socket

public void setSoTimeout(int timeout) 
       throws SocketException 

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0 . A timeout of zero is interpreted as an infinite timeout.

Si proporciona más información acerca de su llamada, i puede mejorar la respuesta.

+0

Intenté configurar el tiempo en 0. (que se suponía que era tiempo infinito) pero, de nuevo, después de 120 segundos lanza una excepción. – Urbanleg

+0

Mientras está conectado, ¿el búfer lee algún dato? quiero decir, ¿está respondiendo el servidor a su conexión ?, porque existe la posibilidad de que la dirección del servidor no se resuelva correctamente en su red, no sé si es local, o un vpn, o simplemente un servidor remoto, no lo hago. No sé si la dirección se resuelve utilizando una consulta de Netbios, o el archivo de host, o un dns remoto, hay muchos elementos que pueden llevar a la dirección incorrecta –

+0

el servidor es local, cuando estoy configurando el proceso de servicio pesado tomar menos de 2 minutos funciona bien. – Urbanleg

2

Está claro que no está configurando el tiempo de espera que cree que está configurando, o que alguien más lo está cambiando después. Tendrás que publicar un código para obtener una mayor elucidación.

Tenga en cuenta que de acuerdo con W. R. Stevens en TCP/IP Illustrated, Vol II, # 17.4, el tiempo de espera se lleva a cabo en un corto como un número de garrapatas 1000 Hz, por lo que un tiempo de espera de más de 11 minutos no es posible. Esto se aplica al código BSD.

+0

@downvoter Por favor explica. ¿Estás en desacuerdo con Stevens? – EJP

Cuestiones relacionadas