Comment définir le délai de connexion dans httpcomponents httpclient? J'ai trouvé la documentation sur: http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html mais il n'est pas clair comment ces paramètres sont réellement définis.
En outre, une explication de la différence entre SO_TIMEOUT
et CONNECTION_TIMEOUT
serait utile.
Dans la version 4.3 d'Apache Http Client, la configuration a été refactorisée (à nouveau). La nouvelle façon de procéder 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();
Dans la version HttpClient 4.3, vous pouvez utiliser l'exemple ci-dessous. Disons pendant 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);
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 faire ça:
Version 1: Définissez un délai d'expiration 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 d'expiration 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);
Dans section 2.5 vous voyez un exemple de définition du paramètre CONNECTION_TIMEOUT.
CONNECTION_TIMEOUT est le temps d'attente pour la connexion initiale et SO_TIMEOUT est le délai d'attente que vous attendez lors de la lecture d'un paquet une fois la connexion établie.
J'ai défini un délai d'expiration pour l'ensemble de la demande pour contourner le 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)