www urlencoded org form example ejemplo application java apache-httpclient-4.x httpconnection

java - urlencoded - Cuál es la diferencia entre setConnectionTimeout, setSoTimeout y "http.connection-manager.timeout" en apache HttpClient API



login httpclient java (4)

En el nivel más bajo, HTTP es un socket TCP. Por lo tanto, cuando solicita una URL y obtiene una respuesta, en un nivel inferior, se crea un socket de cliente que establece la conexión con el socket de servidor remoto, envía algunos datos y recibe una respuesta.

  • setConnectionTimeout : El cliente intenta conectarse al servidor. Esto denota el tiempo transcurrido antes de que se establezca la conexión o el servidor responde a la solicitud de conexión.

  • setSoTimeout : después de establecer la conexión, el socket del cliente espera la respuesta después de enviar la solicitud. Este es el tiempo transcurrido desde que el cliente envió la solicitud al servidor antes de que el servidor responda. Tenga en cuenta que esto no es lo mismo que HTTP Error 408 que el servidor envía al cliente. En otras palabras, se establece su inactividad de período máximo entre dos paquetes de datos consecutivos que llegan al lado del cliente después de la conexión.

  • http.connection-manager.timeout : MultiThreadedHttpConnectionManager usa un grupo de conexiones HTTP . Tiene valores máximos y mínimos por conjunto de host para él. Si todas las conexiones para un host particular han alcanzado el valor máximo, la solicitud de una nueva conexión para el mismo host tendrá que esperar hasta que cualquiera de las conexiones existentes se vuelva gratuita. Este parámetro denota el tiempo transcurrido cuando se realizó una solicitud de conexión y antes de que el HttpConnectionManager devolviera una conexión.

Cuál es la diferencia entre los tres (marcados como comentarios):

MultiThreadedHttpConnectionManager connManag = new MultiThreadedHttpConnectionManager(); HttpConnectionManagerParams managParams = connManag.getParams(); managParams.setConnectionTimeout(connectiontimeout); // 1 managParams.setSoTimeout(sotimeout); //2 HttpMethodBase baseMethod = null; try { HttpClient client = new HttpClient(connManag); client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3 baseMethod = new GetMethod(…); int statusCode = client.executeMethod(…); … } catch (ConnectTimeoutException cte ){ //Took too long to connect to remote host } catch (SocketTimeoutException ste){ //Remote host didn’t respond in time } catch (Exception se){ //Some other error occurred } finally { if (baseMethod != null) baseMethod.releaseConnection(); }

1. setConnectionTimeout - si determina el tiempo de espera hasta que se establezca la conexión.

2. setSoTimeout - si determina el período de inactividad o diferencia de tiempo entre dos paquetes consecutivos,

Entonces, ¿qué hace el siguiente uno?

3. "http.connection-manager.timeout"


En palabras simples:

  • tiempo de espera de conexión: el límite de tiempo que su aplicación espera cuando intenta establecer una conexión con el servidor y no puede (la dirección es incorrecta, el servidor está inactivo, etc.)
  • Tiempo de espera del socket: el límite de tiempo que espera su aplicación después de conectarse al servidor, pero aún espera una respuesta (el servidor colgante puede causar demoras, por ejemplo)
  • Tiempo de espera del administrador de conexión: el límite de tiempo que una solicitud espera cuando está en la cola esperando a que se libere una de las solicitudes del grupo. En otras palabras, en HTTP tenemos un grupo de conexiones con un tamaño máximo. Cuando hay carga en la aplicación, el grupo puede estar lleno y cualquier solicitud nueva debe esperar a que finalice otra solicitud del grupo.

Este diagrama de secuencia podría ayudar.


Se proporciona una explicación detallada en la documentación de gestión de conexión en el sitio del cliente Apache HTTP.

CoreConnectionPNames.SO_TIMEOUT = ''http.socket.timeout'': define el tiempo de espera del socket (SO_TIMEOUT) en milisegundos, que es el tiempo de espera para esperar datos o, dicho de otro modo, un período de inactividad máximo entre dos paquetes de datos consecutivos. Un valor de tiempo de espera de cero se interpreta como un tiempo de espera infinito. Este parámetro espera un valor de tipo java.lang.Integer. Si este parámetro no está establecido, las operaciones de lectura no tendrán tiempo de espera (tiempo de espera infinito).

CoreConnectionPNames.CONNECTION_TIMEOUT = ''http.connection.timeout'': determina el tiempo de espera en milisegundos hasta que se establece una conexión. Un valor de tiempo de espera de cero se interpreta como un tiempo de espera infinito. Este parámetro espera un valor de tipo java.lang.Integer. Si este parámetro no está configurado, las operaciones de conexión no tendrán tiempo de espera (tiempo de espera infinito).

el tiempo de espera de Connection Manager (http.connection-manager.timeout) : el tiempo para esperar una conexión desde el administrador / grupo de conexiones

Para que conste

HttpParams httpParams = httpClient.getParams(); httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000); httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);

es una forma alternativa de hacerlo

HttpParams httpParams = httpClient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000); HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000);

( Más detalles aquí )