Tenemos un cliente Webstart que se comunica con el servidor mediante el envío de objetos serializados a través de HTTPS usando java.net.HttpsURLConnection
.¿Qué podría causar el socket ConnectException: se agotó el tiempo de espera de la conexión?
Todo funciona perfectamente bien en mi máquina local y en servidores de prueba ubicados en nuestra oficina, pero estoy experimentando un problema muy, muy extraño que solo ocurre en nuestros servidores de producción y puesta en escena (y esporádicamente). La principal diferencia que conozco entre esos servidores y los de nuestra oficina es que están ubicados en otra parte y la comunicación entre ellos es considerablemente más lenta, pero también funcionó bien durante mucho tiempo en la producción anterior.
De todos modos, esto es lo que está pasando:
- El cliente, después de configurar opciones tales como el tiempo de espera y las propiedades tales como
Content-Type
en elHttpURLConnection
leer, llamadasgetOutputStream()
en él para obtener la corriente a escribir. - En este punto, por lo que puedo decir, el cliente se bloquea durante un período de tiempo.
- El cliente entonces lanza la siguiente excepción:
java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source) at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(Unknown Source) at sun.net.NetworkClient.doConnect(Unknown Source) at sun.net.www.http.HttpClient.openServer(Unknown Source) at sun.net.www.http.HttpClient.openServer(Unknown Source) at sun.net.www.protocol.https.HttpsClient.(Unknown Source) at sun.net.www.protocol.https.HttpsClient.New(Unknown Source) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
Tenga en cuenta que esto no es un SocketTimeoutException
, que el método connect()
en HttpURLConnection
dice que lanza si el tiempo de espera expira antes de que se pueda establecer una conexión. Además, cuando esto sucede, yo soy capaz de llamar conn.getResponseCode()
y me sale un código de respuesta 200.
- En el lado del servidor, un
EOFException
se lanza en el constructorObjectInputStream
's, que intenta leer el encabezado de serialización pero falla porque el cliente nunca obtiene elOutputStream
para escribir.
En caso de que ayuda, aquí están las llamadas que se realizan en el HttpsURLConnection
antes de la llamada a getOutputStream()
(editado para mostrar solamente se realizan las llamadas en lugar de toda la estructura del código de hacer esto):
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setReadTimeout(30000);
conn.setRequestProperty("Cookie", cookie);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-java-serialized-object");
conn.getOutputStream();
La cuestión es que no tengo idea de cómo podría estar ocurriendo algo de esto, especialmente teniendo en cuenta que solo ocasionalmente (no hay un patrón claro de actividad que yo pueda ver) e incluso cuando hay (relativamente) alto latencia entre el cliente y el servidor.
Dado lo que he podido encontrar hasta ahora sobre java.net.ConnectException: Connect timed out
, me pregunté si no era un problema de red o firewall en la red en la que se ejecutan nuestros servidores ... pero eso no tiene mucho sentido para dado que la solicitud está llegando claramente al servlet. Además, otras aplicaciones que se ejecutan en la misma red no informaron problemas similares.
¿Alguien tiene alguna idea de la causa de esto, o incluso lo que debo investigar?
de acuerdo con la "evaluación" de http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6319814 java.net.ConnectException puede lanzarse "cualquiera" por un tiempo de espera "o" por cualquier otro motivo de error aleatorio ... si eso ayuda a cualquier – rogerdpack