utils org httpclientbuilder example java http apache-httpclient-4.x apache-httpcomponents

java - org - httpclientbuilder maven



Apache HttpComponents HttpClient timeout (5)

En la sección 2.5 , verá un ejemplo de cómo configurar el parámetro CONNECTION_TIMEOUT.

CONNECTION_TIMEOUT es el tiempo de espera de la conexión inicial y SO_TIMEOUT es el tiempo de espera que espera al leer un paquete una vez establecida la conexión.

¿Cómo configuro el tiempo de espera de la conexión en httpcomponents httpclient? Encontré la documentación en: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html pero no está claro cómo se configuran realmente estos parámetros.

Además, una explicación de la diferencia entre SO_TIMEOUT y CONNECTION_TIMEOUT sería útil.


En la versión 4.3 de Apache Http Client, la configuración se refactorizó (nuevamente). La nueva forma se ve así:

RequestConfig.Builder requestBuilder = RequestConfig.custom(); requestBuilder = requestBuilder.setConnectTimeout(timeout); requestBuilder = requestBuilder.setConnectionRequestTimeout(timeout); HttpClientBuilder builder = HttpClientBuilder.create(); builder.setDefaultRequestConfig(requestBuilder.build()); HttpClient client = builder.build();


En la versión HttpClient 4.3, puede usar el siguiente ejemplo ... digamos durante 5 segundos

int timeout = 5; RequestConfig config = RequestConfig.custom() .setConnectTimeout(timeout * 1000) .setConnectionRequestTimeout(timeout * 1000) .setSocketTimeout(timeout * 1000).build(); CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); HttpGet request = new HttpGet("http://localhost:8080/service"); // GET Request response = client.execute(request);


Establecí un tiempo de espera excedido para toda la solicitud para resolver el problema java.net.SocketInputStream.socketRead0 .

private static final ScheduledExecutorService SCHEDULED_EXECUTOR = Executors.newSingleThreadScheduledExecutor() HttpGet request = new HttpGet("http://www.example.com") final Runnable delayedTask = new Runnable() { @Override public void run() { request.abort() } } SCHEDULED_EXECUTOR.schedule(delayedTask, 100000, TimeUnit.MILLISECONDS)


La respuesta de @jontro es correcta, pero siempre es bueno tener un fragmento de código sobre cómo hacer esto. Hay dos maneras de hacer esto:

Versión 1: establezca un tiempo de espera de 10 segundos para cada uno de estos parámetros:

HttpClient httpclient = new DefaultHttpClient(); // this one causes a timeout if a connection is established but there is // no response within 10 seconds httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10 * 1000); // this one causes a timeout if no connection is established within 10 seconds httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10 * 1000); // now do the execute: HttpGet httpget = new HttpGet(URL); HttpResponse response = httpclient.execute(httpget);



Versión 2: también establece un tiempo de espera de 10 segundos para cada uno de estos parámetros:

HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 10 * 1000); HttpConnectionParams.setSoTimeout(params, 10 * 1000); HttpClient httpclient = new DefaultHttpClient(params); HttpGet httpget = new HttpGet(URL); HttpResponse response = httpclient.execute(httpget);