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
This commit is contained in:
Stephane Nicoll 2014-12-22 16:31:07 +01:00
parent 24b82746b5
commit aafdcecf53
4 changed files with 39 additions and 2 deletions

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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());
}

View File

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