46 votes

Apache HttpComponents HttpClient timeout

Comment puis-je définir le délai de connexion dans httpcomponents httpclient ? J'ai trouvé la documentation à l'adresse suivante : http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html mais la manière dont ces paramètres sont effectivement définis n'est pas claire.

En outre, une explication de la différence entre SO_TIMEOUT y CONNECTION_TIMEOUT serait utile.

105voto

30thh Points 1662

Dans la version 4.3 de Apache Http Client, la configuration a été remaniée (encore). La nouvelle méthode ressemble à ceci :

RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder.setConnectTimeout(timeout);
requestBuilder.setConnectionRequestTimeout(timeout);

HttpClientBuilder builder = HttpClientBuilder.create();     
builder.setDefaultRequestConfig(requestBuilder.build());
HttpClient client = builder.build();

12voto

MAA Points 262

Dans la version 4.3 de HttpClient, vous pouvez utiliser l'exemple ci-dessous disons pour 5 secondes

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);

9voto

quux00 Points 2496

La réponse de @jontro est correcte, mais il est toujours agréable d'avoir un extrait de code sur la façon de procéder. Il y a deux façons de procéder :

Version 1 : Définissez un délai de 10 secondes pour chacun de ces paramètres :

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);

Version 2 : Définissez également un délai de 10 secondes pour chacun de ces paramètres :

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);

5voto

jontro Points 3423

Sur section 2.5 vous voyez un exemple de la façon de définir le paramètre CONNECTION_TIMEOUT.

CONNECTION_TIMEOUT est le délai d'attente pour la connexion initiale et SO_TIMEOUT est le délai d'attente pour la lecture d'un paquet après l'établissement de la connexion.

3voto

soulmachine Points 67

J'ai fixé un délai d'attente strict pour l'ensemble de la requête afin de contourner le problème. java.net.SocketInputStream.socketRead0 problème.

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X