From aafdcecf5341c6bafe676522a01c88255fedcf0b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 22 Dec 2014 16:31:07 +0100 Subject: [PATCH] Customize connection request timeout Prior to this commit it was not possible to easily customize the connection request timeout used by the HttpClient. Both `HttpComponentsClientHttpRequestFactory` and `HttpComponentsClientHttpRequestFactoryTests` have been updated to support a `connectionRequestTimeout` property. Issue: SPR-12166 --- .../HttpComponentsClientHttpRequestFactory.java | 15 ++++++++++++++- .../HttpComponentsHttpInvokerRequestExecutor.java | 14 +++++++++++++- ...tpComponentsClientHttpRequestFactoryTests.java | 2 ++ ...ComponentsHttpInvokerRequestExecutorTests.java | 10 ++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java index 59101d48815..059ee55f606 100644 --- a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java @@ -61,6 +61,8 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest private int connectTimeout; + private int connectionRequestTimeout; + private int socketTimeout; private boolean bufferRequestBody = true; @@ -139,6 +141,16 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest } } + /** + * Set the timeout in milliseconds used when requesting a connection from the connection + * manager using the underlying HttpClient. + * A timeout value of 0 specifies an infinite timeout. + * @param connectionRequestTimeout the timeout value to request a connection in milliseconds + */ + public void setConnectionRequestTimeout(int connectionRequestTimeout) { + this.connectionRequestTimeout = connectionRequestTimeout; + } + /** * Set the socket read timeout for the underlying HttpClient. * A timeout value of 0 specifies an infinite timeout. @@ -193,9 +205,10 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest config = ((Configurable) httpRequest).getConfig(); } if (config == null) { - if (this.socketTimeout > 0 || this.connectTimeout > 0) { + if (this.connectTimeout > 0 || this.connectionRequestTimeout > 0 || this.socketTimeout > 0) { config = RequestConfig.custom() .setConnectTimeout(this.connectTimeout) + .setConnectionRequestTimeout(this.connectionRequestTimeout) .setSocketTimeout(this.socketTimeout) .build(); } diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java index 4423c1a060a..43dd667f17b 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java @@ -70,6 +70,7 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke private HttpClient httpClient; private int connectionTimeout = 0; + private int connectionRequestTimeout = 0; private int readTimeout = DEFAULT_READ_TIMEOUT_MILLISECONDS; @@ -148,6 +149,16 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke } } + /** + * Set the timeout in milliseconds used when requesting a connection from the connection + * manager using the underlying HttpClient. + * A timeout value of 0 specifies an infinite timeout. + * @param connectionRequestTimeout the timeout value to request a connection in milliseconds + */ + public void setConnectionRequestTimeout(int connectionRequestTimeout) { + this.connectionRequestTimeout = connectionRequestTimeout; + } + /** * Set the socket read timeout for the underlying HttpClient. * A timeout value of 0 specifies an infinite timeout. @@ -240,9 +251,10 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke * @return the RequestConfig to use */ protected RequestConfig createRequestConfig(HttpInvokerClientConfiguration config) { - if (this.connectionTimeout > 0 || this.readTimeout > 0) { + if (this.connectionTimeout > 0 || this.connectionRequestTimeout > 0 || this.readTimeout > 0) { return RequestConfig.custom() .setConnectTimeout(this.connectionTimeout) + .setConnectionRequestTimeout(this.connectionRequestTimeout) .setSocketTimeout(this.readTimeout) .build(); } diff --git a/spring-web/src/test/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactoryTests.java b/spring-web/src/test/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactoryTests.java index 2e5fd6a9a84..8d0dae0e824 100644 --- a/spring-web/src/test/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactoryTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactoryTests.java @@ -63,6 +63,7 @@ public class HttpComponentsClientHttpRequestFactoryTests extends AbstractHttpReq HttpClient httpClient = HttpClientBuilder.create().build(); HttpComponentsClientHttpRequestFactory hrf = new HttpComponentsClientHttpRequestFactory(httpClient); hrf.setConnectTimeout(1234); + hrf.setConnectionRequestTimeout(4321); hrf.setReadTimeout(4567); URI uri = new URI(baseUrl + "/status/ok"); @@ -75,6 +76,7 @@ public class HttpComponentsClientHttpRequestFactoryTests extends AbstractHttpReq RequestConfig.class.isInstance(config)); RequestConfig requestConfig = (RequestConfig) config; assertEquals("Wrong custom connection timeout", 1234, requestConfig.getConnectTimeout()); + assertEquals("Wrong custom connection request timeout", 4321, requestConfig.getConnectionRequestTimeout()); assertEquals("Wrong custom socket timeout", 4567, requestConfig.getSocketTimeout()); } diff --git a/spring-web/src/test/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutorTests.java b/spring-web/src/test/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutorTests.java index 9de87fa177c..dd61f753463 100644 --- a/spring-web/src/test/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutorTests.java +++ b/spring-web/src/test/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutorTests.java @@ -43,6 +43,16 @@ public class HttpComponentsHttpInvokerRequestExecutorTests { assertEquals(5000, httpPost.getConfig().getConnectTimeout()); } + @Test + public void customizeConnectionRequestTimeout() throws IOException { + HttpComponentsHttpInvokerRequestExecutor executor = new HttpComponentsHttpInvokerRequestExecutor(); + executor.setConnectionRequestTimeout(7000); + + HttpInvokerClientConfiguration config = mockHttpInvokerClientConfiguration("http://fake-service"); + HttpPost httpPost = executor.createHttpPost(config); + assertEquals(7000, httpPost.getConfig().getConnectionRequestTimeout()); + } + @Test public void customizeReadTimeout() throws IOException { HttpComponentsHttpInvokerRequestExecutor executor = new HttpComponentsHttpInvokerRequestExecutor();