From df7ecf81c93cca3e735a8ce8ac2f529d75d2e659 Mon Sep 17 00:00:00 2001 From: Felipe Adorno Date: Wed, 17 Feb 2021 19:38:43 -0300 Subject: [PATCH] get timeout from property source (#3965) I try solve the problem getting values from environment, if have any other way to do that please ping me. Fixes #3786 --- .../ribbon/RibbonClientConfiguration.java | 21 +++++++++++-- .../RibbonLoadBalancingHttpClientTests.java | 30 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/spring-cloud-netflix-ribbon/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java b/spring-cloud-netflix-ribbon/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java index ba6bd047d..f6bd423ad 100644 --- a/spring-cloud-netflix-ribbon/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java +++ b/spring-cloud-netflix-ribbon/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java @@ -25,6 +25,7 @@ import com.netflix.client.RetryHandler; import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.DefaultClientConfigImpl; import com.netflix.client.config.IClientConfig; +import com.netflix.client.config.IClientConfigKey; import com.netflix.loadbalancer.ConfigurationBasedServerList; import com.netflix.loadbalancer.DummyPing; import com.netflix.loadbalancer.ILoadBalancer; @@ -52,6 +53,7 @@ import org.springframework.cloud.netflix.ribbon.okhttp.OkHttpRibbonConfiguration import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; import static com.netflix.client.config.CommonClientConfigKey.DeploymentContextBasedVipAddresses; import static org.springframework.cloud.netflix.ribbon.RibbonUtils.setRibbonProperty; @@ -95,17 +97,32 @@ public class RibbonClientConfiguration { @Autowired private PropertiesFactory propertiesFactory; + @Autowired + private Environment environment; + @Bean @ConditionalOnMissingBean public IClientConfig ribbonClientConfig() { DefaultClientConfigImpl config = new DefaultClientConfigImpl(); + config.loadProperties(this.name); - config.set(CommonClientConfigKey.ConnectTimeout, DEFAULT_CONNECT_TIMEOUT); - config.set(CommonClientConfigKey.ReadTimeout, DEFAULT_READ_TIMEOUT); + + config.set(CommonClientConfigKey.ConnectTimeout, getProperty( + CommonClientConfigKey.ConnectTimeout, DEFAULT_CONNECT_TIMEOUT)); + + config.set(CommonClientConfigKey.ReadTimeout, + getProperty(CommonClientConfigKey.ReadTimeout, DEFAULT_READ_TIMEOUT)); + config.set(CommonClientConfigKey.GZipPayload, DEFAULT_GZIP_PAYLOAD); return config; } + private Integer getProperty(IClientConfigKey connectTimeout, + int defaultConnectTimeout) { + return environment.getProperty("ribbon." + connectTimeout, Integer.class, + defaultConnectTimeout); + } + @Bean @ConditionalOnMissingBean public IRule ribbonRule(IClientConfig config) { diff --git a/spring-cloud-netflix-ribbon/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java b/spring-cloud-netflix-ribbon/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java index ae027b71d..7a83f9db9 100644 --- a/spring-cloud-netflix-ribbon/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java +++ b/spring-cloud-netflix-ribbon/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java @@ -53,6 +53,7 @@ import org.mockito.ArgumentMatcher; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory; import org.springframework.cloud.commons.httpclient.HttpClientConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; @@ -156,6 +157,21 @@ public class RibbonLoadBalancingHttpClientTests { assertThat(result.isContentCompressionEnabled()).isTrue(); } + @Test + public void testTimeoutsFromProperties() throws Exception { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + HttpClientConfiguration.class, RibbonAutoConfiguration.class, + UseDefaults.class); + TestPropertyValues.of("ribbon.ConnectTimeout=1265", "ribbon.ReadTimeout=587") + .applyTo(context); + + RequestConfig result = getBuiltRequestConfig(null, new SpringClientFactory(), + context); + + assertThat(result.getConnectTimeout()).isEqualTo(1265); + assertThat(result.getSocketTimeout()).isEqualTo(587); + } + @Test public void testCompressionDisabled() throws Exception { IClientConfig configOverride = DefaultClientConfigImpl @@ -947,10 +963,18 @@ public class RibbonLoadBalancingHttpClientTests { private RequestConfig getBuiltRequestConfig(Class defaultConfigurationClass, IClientConfig configOverride, SpringClientFactory factory) throws Exception { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + HttpClientConfiguration.class, RibbonAutoConfiguration.class, + defaultConfigurationClass); + return getBuiltRequestConfig(configOverride, factory, context); + } + + private RequestConfig getBuiltRequestConfig(IClientConfig configOverride, + SpringClientFactory factory, AnnotationConfigApplicationContext context) + throws Exception { + + factory.setApplicationContext(context); - factory.setApplicationContext( - new AnnotationConfigApplicationContext(HttpClientConfiguration.class, - RibbonAutoConfiguration.class, defaultConfigurationClass)); String serviceName = "foo"; String host = serviceName; int port = 80;