2011-05-16 27 views

Respuesta

75

En la versión 4.3 de Apache Http Client, se refactorizó la configuración (aga en). La nueva forma se parece a esto:

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(); 
+6

Debe agregar' requestBuilder.setSocketTimeout (timeout); 'también. Tenga en cuenta que 'timeout' debe ser de milisegundos. – Stefan

+2

Tenga en cuenta que llamar a 'setConnectTimeout()' y ['setConnectionRequestTimeout()'] (http://stackoverflow.com/questions/20271017/connection-and-connection-request-timeout#comment30255182_20271424) es ** no ** el mismo como configuración 'CONNECTION_TIMEOUT' y' SO_TIMEOUT' (como en la pregunta). Probablemente desee 'setConnectTimeout()' y 'setSocketTimeout()'. – Jonik

+4

Además, el Generador le permite encadenar esas declaraciones para un código mucho más simple: 'RequestConfig config = RequestConfig.custom(). SetConnectTimeout (timeout) .setSocketTimeout (timeout) .build();' – Jonik

4

En section 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.

8

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

Versión 1: Establecer un segundo tiempo de espera de 10 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 estableció un segundo tiempo de espera de 10 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); 
+0

Ver también los métodos estáticos HttpConnectionParams.setConnectionTimeout() y HttpConnectionParams.setSoTimeout() que proporcionan una manera un poco más conveniente para lograr la misma cosa. – dnault

+0

Gracias. He actualizado la respuesta con esta opción. – quux00

+0

Extremadamente útil. ¡¡¡Muchas gracias!!! –

7

En HttpClient 4,3 versión se puede utilizar más adelante ejemplo .. Digamos que 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); 
1

puedo configurar un tiempo de espera dura para toda la solicitud para solucionar el java.net.SocketInputStream.socketRead0 problema.

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) 
Cuestiones relacionadas