diff --git a/docs/src/main/asciidoc/spring-cloud-config.adoc b/docs/src/main/asciidoc/spring-cloud-config.adoc index 3cd769f7..d4282f9d 100644 --- a/docs/src/main/asciidoc/spring-cloud-config.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config.adoc @@ -1435,9 +1435,12 @@ To ensure high availability when you have multiple instances of Config Server de If you use HTTP basic security on your Config Server, it is currently possible to support per-Config Server auth credentials only if you embed the credentials in each URL you specify under the `spring.cloud.config.uri` property. If you use any other kind of security mechanism, you cannot (currently) support per-Config Server authentication and authorization. -=== Configuring Read Timeouts +=== Configuring Timeouts -If you want to configure read timeout, this can be done by using the property `spring.cloud.config.request-read-timeout`. +If you want to configure timeout thresholds: + +* Read timeouts can be configured by using the property `spring.cloud.config.request-read-timeout`. +* Connection timeouts can be configured by using the property `spring.cloud.config.request-connect-timeout`. === Security diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java index 32da6ebb..11b215b6 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java @@ -114,6 +114,11 @@ public class ConfigClientProperties { */ private int requestReadTimeout = (60 * 1000 * 3) + 5000; + /** + * timeout on waiting to connect to the Config Server. + */ + private int requestConnectTimeout = 1000 * 10; + /** * Flag to indicate whether to send state. Default true. */ @@ -227,6 +232,14 @@ public class ConfigClientProperties { this.requestReadTimeout = requestReadTimeout; } + public int getRequestConnectTimeout() { + return this.requestConnectTimeout; + } + + public void setRequestConnectTimeout(int requestConnectTimeout) { + this.requestConnectTimeout = requestConnectTimeout; + } + public boolean isSendState() { return this.sendState; } @@ -333,6 +346,7 @@ public class ConfigClientProperties { + ", username=" + this.username + ", password=" + this.password + ", uri=" + Arrays.toString(this.uri) + ", discovery=" + this.discovery + ", failFast=" + this.failFast + ", token=" + this.token + + ", requestConnectTimeout=" + this.requestConnectTimeout + ", requestReadTimeout=" + this.requestReadTimeout + ", sendState=" + this.sendState + ", headers=" + this.headers + "]"; } diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocator.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocator.java index fd8bf2e9..be4cb5c8 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocator.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocator.java @@ -257,7 +257,11 @@ public class ConfigServicePropertySourceLocator implements PropertySourceLocator if (client.getRequestReadTimeout() < 0) { throw new IllegalStateException("Invalid Value for Read Timeout set."); } + if (client.getRequestConnectTimeout() < 0) { + throw new IllegalStateException("Invalid Value for Connect Timeout set."); + } requestFactory.setReadTimeout(client.getRequestReadTimeout()); + requestFactory.setConnectTimeout(client.getRequestConnectTimeout()); RestTemplate template = new RestTemplate(requestFactory); Map headers = new HashMap<>(client.getHeaders()); if (headers.containsKey(AUTHORIZATION)) { diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocatorTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocatorTests.java index 7857eb00..7b34385e 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocatorTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocatorTests.java @@ -261,6 +261,16 @@ public class ConfigServicePropertySourceLocatorTests { ReflectionTestUtils.invokeMethod(this.locator, "getSecureRestTemplate", defaults); } + @Test + public void shouldThrowExceptionWhenNegativeConnectTimeoutSet() { + ConfigClientProperties defaults = new ConfigClientProperties(this.environment); + defaults.setRequestConnectTimeout(-1); + this.locator = new ConfigServicePropertySourceLocator(defaults); + this.expected.expect(IllegalStateException.class); + this.expected.expectMessage("Invalid Value for Connect Timeout set."); + ReflectionTestUtils.invokeMethod(this.locator, "getSecureRestTemplate", defaults); + } + @Test public void checkInterceptorHasNoAuthorizationHeaderPresent() { ConfigClientProperties defaults = new ConfigClientProperties(this.environment);