closeablehttpclient - httpclient timeout java
Uso de Apache HttpClient para configurar el TIEMPO DE ESPERA en una solicitud y respuesta (2)
Las excepciones que verá serán ConnectTimeoutException
y SocketTimeoutException
. Los valores de tiempo de espera reales que usa deben ser el tiempo máximo que su aplicación está dispuesta a esperar. Una nota importante sobre el tiempo de espera de lectura es que corresponde al tiempo de espera de una lectura de socket. Por lo tanto, no es el tiempo permitido para que llegue la respuesta completa, sino el tiempo asignado a una sola toma de lectura. Entonces, si hay 4 lecturas de socket, cada una de ellas toma 9 segundos, el tiempo total de lectura es 9 * 4 = 36 segundos.
Si desea especificar un tiempo total para que llegue la respuesta (incluida la conexión y el tiempo total de lectura), puede ajustar la llamada en un hilo y usar un tiempo de espera de hilo para eso. Por ejemplo, normalmente hago algo como esto:
Future<T> future = null;
future = pool.submit(new Callable<T>() {
public T call() {
return executeImpl(url);
}
});
try {
return future.get(10, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
log.warn("task interrupted", name);
}
catch (ExecutionException e) {
log.error(name + " execution exception", e);
}
catch (TimeoutException e) {
log.debug("future timed out", name);
}
Algunas suposiciones hechas en el código anterior son: 1) esto está en una función con un parámetro url, 2) está en una clase con una variable de nombre, 3) log es una instancia de log4j, y 4) pool es un ejecutor de un grupo de subprocesos . Tenga en cuenta que incluso si usa un tiempo de espera de subproceso, también debe especificar un tiempo de espera de conexión y de zócalo en el HttpClient, para que las solicitudes lentas no consuman los recursos en el grupo de subprocesos. También tenga en cuenta que uso un conjunto de subprocesos porque normalmente lo uso en un servicio web, por lo que el conjunto de subprocesos se comparte entre un montón de subprocesos tomcat. Su entorno puede ser diferente, y puede preferir simplemente generar un nuevo hilo para cada llamada.
Además, normalmente veo los tiempos de espera establecidos a través de las funciones miembro de los parámetros, como esto:
params.setConnectionTimeout(10000);
params.setSoTimeout(10000);
Pero quizás tu sintaxis también funcione (no estoy seguro).
Necesito establecer un tiempo de espera para la solicitud de HTTP que hacemos a un servicio (no a un servicio web). Estamos utilizando el cliente HTTP Apache. He agregado estas 2 líneas de código para establecer el tiempo de espera en la solicitud y la respuesta al servicio.
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
1) Actualmente, he establecido 10 segundos como tiempo de espera, ya que veo que la respuesta del servicio es casi instantánea. ¿Debo aumentar o disminuir el tiempo?
2) ¿Qué sucederá cuando la respuesta demore más de 10 segundos? ¿Lanzará la excepción y qué excepción será? ¿Hay alguna otra cosa que deba agregar para establecer el tiempo de espera en el siguiente código?
public HashMap<String, Object> getJSONData(String url) throw Exception{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
HttpHost proxy = new HttpHost(getProxy(), getProxyPort());
ConnRouteParams.setDefaultProxy(params, proxy);
URI uri;
InputStream data = null;
try {
uri = new URI(url);
HttpGet method = new HttpGet(uri);
HttpResponse response = httpClient.execute(method);
data = response.getEntity().getContent();
}
catch (Exception e) {
e.printStackTrace();
}
Reader r = new InputStreamReader(data);
HashMap<String, Object> jsonObj = (HashMap<String, Object>) GenericJSONUtil.fromJson(r);
return jsonObj;
}
Supongo que muchas personas vienen aquí por el título y porque la API HttpConnectionParams
está en desuso.
Usando una versión reciente de Apache HTTP Client, puede establecer estos tiempos de espera usando los parámetros de solicitud:
HttpPost request = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(TIMEOUT_MILLIS)
.setConnectTimeout(TIMEOUT_MILLIS)
.setConnectionRequestTimeout(TIMEOUT_MILLIS)
.build();
request.setConfig(requestConfig);
Alternativamente, también puede configurar esto cuando cree su Cliente HTTP, utilizando la API del constructor para el cliente HTTP, pero también necesitará crear un administrador de conexión personalizado con una configuración de socket personalizada.
El archivo de ejemplo de configuración es un recurso excelente para averiguar cómo configurar el cliente HTTP de Apache.