diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java index 1fa68564..daa1e831 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java @@ -43,30 +43,53 @@ import static org.springframework.cloud.netflix.ribbon.RibbonUtils.updateToHttps public class RibbonLoadBalancingHttpClient extends AbstractLoadBalancingClient { - private final HttpClient delegate = HttpClientBuilder.create().disableCookieManagement().build(); + private final HttpClient delegate; private final IClientConfig config; private final ServerIntrospector serverIntrospector; @Deprecated public RibbonLoadBalancingHttpClient() { - super(); - this.config = new DefaultClientConfigImpl(); - this.serverIntrospector = new DefaultServerIntrospector(); + this(new DefaultClientConfigImpl(), new DefaultServerIntrospector()); } @Deprecated public RibbonLoadBalancingHttpClient(final ILoadBalancer lb) { super(lb); this.config = new DefaultClientConfigImpl(); + this.delegate = createHttpClient(this.config); this.serverIntrospector = new DefaultServerIntrospector(); + initWithNiwsConfig(config); } public RibbonLoadBalancingHttpClient(IClientConfig config, ServerIntrospector serverIntrospector) { + this.delegate = createHttpClient(config); this.config = config; this.serverIntrospector = serverIntrospector; initWithNiwsConfig(config); } + public RibbonLoadBalancingHttpClient(HttpClient delegate, IClientConfig config, ServerIntrospector serverIntrospector) { + this.delegate = delegate; + this.config = config; + this.serverIntrospector = serverIntrospector; + initWithNiwsConfig(config); + } + + protected HttpClient createHttpClient(IClientConfig config) { + return HttpClientBuilder.create() + // already defaults to 0 in builder, so resetting to 0 won't hurt + .setMaxConnTotal(config.getPropertyAsInteger(CommonClientConfigKey.MaxTotalConnections, 0)) + // already defaults to 0 in builder, so resetting to 0 won't hurt + .setMaxConnPerRoute(config.getPropertyAsInteger(CommonClientConfigKey.MaxConnectionsPerHost, 0)) + .disableCookieManagement() + .useSystemProperties() // for proxy + .build(); + } + + protected HttpClient getDelegate() { + return this.delegate; + } + @Override public RibbonApacheHttpResponse execute(RibbonApacheHttpRequest request, final IClientConfig configOverride) throws Exception { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java index 7adc1b54..cc372125 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java @@ -20,6 +20,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; @@ -73,6 +74,20 @@ public class RibbonLoadBalancingHttpClientTests { assertThat(result.getSocketTimeout(), is (50000)); } + @Test + public void testConnections() throws Exception { + SpringClientFactory factory = new SpringClientFactory(); + factory.setApplicationContext(new AnnotationConfigApplicationContext( + RibbonAutoConfiguration.class, Connections.class)); + RibbonLoadBalancingHttpClient client = factory.getClient("service", + RibbonLoadBalancingHttpClient.class); + + HttpClient delegate = client.getDelegate(); + PoolingHttpClientConnectionManager connManager = (PoolingHttpClientConnectionManager) ReflectionTestUtils.getField(delegate, "connManager"); + assertThat(connManager.getMaxTotal(), is(101)); + assertThat(connManager.getDefaultMaxPerRoute(), is(201)); + } + @Test public void testRequestConfigDoNotFollowRedirectsOverrideWithFollowRedirects() throws Exception { @@ -135,6 +150,18 @@ public class RibbonLoadBalancingHttpClientTests { } } + + @Configuration + protected static class Connections { + @Bean + public IClientConfig clientConfig() { + DefaultClientConfigImpl config = new DefaultClientConfigImpl(); + config.set(CommonClientConfigKey.MaxTotalConnections, 101); + config.set(CommonClientConfigKey.MaxConnectionsPerHost, 201); + return config; + } + } + private RequestConfig getBuiltRequestConfig(Class defaultConfigurationClass, IClientConfig configOverride) throws Exception {