Apache HttpClient timeout

Existe-t-il un moyen de spécifier un délai d’attente pour toute l’exécution de HttpClient ?

J’ai essayé ce qui suit:

 httpClient.getParams().setParameter("http.socket.timeout", timeout * 1000); httpClient.getParams().setParameter("http.connection.timeout", timeout * 1000); httpClient.getParams().setParameter("http.connection-manager.timeout", new Long(timeout * 1000)); httpClient.getParams().setParameter("http.protocol.head-body-timeout", timeout * 1000); 

Cela fonctionne bien, sauf si un hôte distant envoie des données – même à un octet / seconde – il continuera à lire pour toujours! Mais je veux interrompre la connexion en 10 secondes maximum, que l’hôte réponde ou non.

Il n’y a actuellement aucun moyen de définir une durée de requête maximale de ce type: vous voulez essentiellement dire que peu importe si une étape de requête spécifique expire ou non, mais que toute la demande ne doit pas durer plus de 15 secondes (par exemple) .

Votre meilleur pari serait d’exécuter une timer séparée, et quand il expire, récupérez le gestionnaire de connexion utilisé par l’instance HttpClient et fermez la connexion, ce qui devrait mettre fin au lien. Laissez-moi savoir si cela fonctionne pour vous.

Pour une version plus récente de httpclient (par exemple, les composants http 4.3 – https://hc.apache.org/httpcomponents-client-4.3.x/index.html ):

 int CONNECTION_TIMEOUT_MS = timeoutSeconds * 1000; // Timeout in millis. RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(CONNECTION_TIMEOUT_MS) .setConnectTimeout(CONNECTION_TIMEOUT_MS) .setSocketTimeout(CONNECTION_TIMEOUT_MS) .build(); HttpPost httpPost = new HttpPost(URL); httpPost.setConfig(requestConfig); 

Fonctionne bien, comme proposé par Femi. Merci!

 Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { if(getMethod != null) { getMethod.abort(); } } }, timeout * 1000); 

Dans la version HttpClient 4.3, vous pouvez utiliser l’exemple ci-dessous .. laissez dire 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); 

En partant des autres réponses, ma solution consistait à utiliser un HttpRequestInterceptor pour append l’abandon exécutable à chaque requête. J’ai aussi échangé la Timer pour un ScheduledExecutorService .

 public class TimeoutInterceptor implements HttpRequestInterceptor { private int requestTimeout = 1 * DateTimeConstants.MILLIS_PER_MINUTE; private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); public TimeoutInterceptor() { } public TimeoutInterceptor(final int requestTimeout) { this.requestTimeout = requestTimeout; } @Override public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { if (request instanceof AbstractExecutionAwareRequest) { final AbstractExecutionAwareRequest abortableRequest = (AbstractExecutionAwareRequest) request; setAbort(abortableRequest); } else if (request instanceof HttpRequestWrapper) { HttpRequestWrapper wrapper = (HttpRequestWrapper) request; this.process(wrapper.getOriginal(), context); } } /** * @param abortableRequest */ private void setAbort(final AbstractExecutionAwareRequest abortableRequest) { final SoftReference requestRef = new SoftReference(abortableRequest); executorService.schedule(new Runnable() { @Override public void run() { AbstractExecutionAwareRequest actual = requestRef.get(); if (actual != null && !actual.isAborted()) { actual.abort(); } } }, requestTimeout, TimeUnit.MILLISECONDS); } public void setRequestTimeout(final int requestTimeout) { this.requestTimeout = requestTimeout; } } 

C’est aussi du travail:

 HttpClient client = new DefaultHttpClient(); HttpConnectionParams.setConnectionTimeout(client.getParams(), timeout * 1000); HttpConnectionParams.setSoTimeout(client.getParams(), timeout * 1000);