Estamos utilizando HttpURLConnection API para invocar una API REST al mismo proveedor a menudo (tipo de uso de agregación). Queremos mantener un grupo de 5 conexiones siempre abiertas para el host del proveedor (siempre la misma IP).cómo mantener múltiples Java HttpConnections abiertas al mismo destino
¿Cuál es la solución adecuada? Esto es lo que tratamos:
System.setProperty("http.maxConnections", 5); // set globally only once
...
// everytime we need a connection, we use the following
HttpURLConnection conn = (HttpURLConnection) (new URL(url)).openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);
conn.setUseCaches(true);
...
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
...
En este punto, leemos el flujo de entrada hasta que el BufferedReader no devuelve nada más bytes. ¿Qué hacemos después de ese punto si queremos reutilizar la conexión subyacente al proveedor? Teníamos la impresión de que si la secuencia de entrada se leía por completo, la conexión se vuelve a agregar al grupo.
Se ha estado trabajando durante varias semanas de esta manera, pero hoy en día que dejó de funcionar producir esta excepción: java.net.SocketException: Too many open files
Encontramos numerosas tomas en el estado CLOSE_WAIT así (mediante la ejecución de lsof
): java 1814 root 97u IPv6 844702 TCP colinux:58517->123.123.254.205:www (CLOSE_WAIT)
Won ¿Conn.getInputStream(). close() o conn.disconnect() cierran completamente la conexión y la eliminan del grupo?
Gracias, tienes razón, no estábamos leyendo el flujo de error en caso de fallo. ¿Qué pasa con 'stream.close()' y 'conn.disconnect()'? ¿Están bien para usar o van a derrotar el propósito de http mantener vivo? Leí en algún lado cuando escribí el código que debería leer la secuencia por completo, pero no cerrarla, pero no puedo encontrar la atmósfera de referencia. – Lightbeard
No debe cerrar la transmisión ni desconectar la conexión si desea reutilizar la conexión. Como dije, todavía puede haber fugas de socket incluso si haces todo bien, al menos en Java 5. –