J'utilise le client http Apache 4.3.2 pour envoyer des requêtes get. Ce que j'ai fait c'est:
private final RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(1000)
.setConnectionRequestTimeout(1000)
.setSocketTimeout(1000)
.build();
private final HttpClient client = HttpClientBuilder.create()
.disableAuthCaching()
.disableAutomaticRetries()
.disableConnectionState()
.disableContentCompression()
.disableCookieManagement()
.disableRedirectHandling()
.setDefaultRequestConfig(requestConfig)
.build();
Et lors de l'envoi de la demande:
HttpGet request = null;
try {
request = new HttpGet(url);
if (client.execute(request).getStatusLine().getStatusCode() == 200) {
/* do some work here */
}
} catch (Exception e) {
Logger.error(e);
} finally {
if (request != null) {
request.releaseConnection();
}
}
Mais certaines de mes demandes mettent encore longtemps à expirer. C'est une trace de pile d'exception:
Java.net.SocketTimeoutException: Read timed out
at Java.net.SocketInputStream.socketRead0(Native Method)
at Java.net.SocketInputStream.read(SocketInputStream.Java:152)
at Java.net.SocketInputStream.read(SocketInputStream.Java:122)
at org.Apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.Java:136)
at org.Apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.Java:152)
at org.Apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.Java:270)
at org.Apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.Java:140)
at org.Apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.Java:57)
at org.Apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.Java:260)
at org.Apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.Java:161)
at Sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.Apache.http.impl.conn.CPoolProxy.invoke(CPoolProxy.Java:138)
at com.Sun.proxy.$Proxy0.receiveResponseHeader(Unknown Source)
at org.Apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.Java:271)
at org.Apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.Java:123)
at org.Apache.http.impl.execchain.MainClientExec.execute(MainClientExec.Java:254)
at org.Apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.Java:195)
at org.Apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.Java:186)
at org.Apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.Java:82)
at org.Apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.Java:106)
at org.Apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.Java:57)
Y a-t-il une autre valeur de délai d'attente que je devrais définir? Qu'est-ce que je fais mal?
Lorsque j'ai eu ce problème, j'ai modifié ma demande pour configurer le délai d'expiration de chaque demande.
//...
HttpRequestBase request = new HttpGet(url); //or HttpPost
RequestConfig.Builder requestConfig = RequestConfig.custom();
requestConfig.setConnectTimeout(30 * 1000);
requestConfig.setConnectionRequestTimeout(30 * 1000);
requestConfig.setSocketTimeout(30 * 1000);
request.setConfig(requestConfig.build());
CloseableHttpResponse response = client.execute(request);
//...
Cela a bien fonctionné.
Voici un exemple d'extrait de code pour atteindre l'objectif:
int timeout = 5;
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(timeout * 1000)
.setConnectionRequestTimeout(timeout * 1000)
.setSocketTimeout(timeout * 1000).build();
CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
Il s'agit de la méthode recommandée pour configurer les trois délais d'expiration de manière sûre et lisible.
Vous pouvez essayer d'interrompre la demande avec HttpUriRequest # abort (), voir https://hc.Apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/Apache/http/client/methods /HttpUriRequest.html#abort%28%29 . Cependant, définir un timemout qui ne nécessite aucune interception serait plus agréable.
private static final Integer TIMEOUT = 300;
private static final Integer MILLISECONDS = 1000;
RequestConfig config = RequestConfig.custom (). SetConnectTimeout (TIMEOUT * MILLISECONDS) .setConnectionRequestTimeout (TIMEOUT * MILLISECONDS) .setSocketTimeout (TIMEOUT * MILLISECONDS) .build ();
httpClientBuilder.setDefaultRequestConfig (config); httpClientBuilder.setSSLSocketFactory (sslConnectionSocketFactory);
J'obtiens échoué: La connexion a expiré: erreur de connexion pendant 20 secondes, même si j'ai défini le temps 5 minutes.