diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java index f411fad2..3b808528 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.TimeUnit; import static com.netflix.hystrix.HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE; @@ -40,6 +41,7 @@ import static com.netflix.hystrix.HystrixCommandProperties.ExecutionIsolationStr * @author Spencer Gibb * @author Dave Syer * @author Mathias Düsterhöft + * @author Bilal Alp */ @Data @ConfigurationProperties("zuul") @@ -326,6 +328,14 @@ public class ZuulProperties { * The maximum number of connections that can be used by a single route. */ private int maxPerRouteConnections = 20; + /** + * The lifetime for the connection pool. + */ + private long timeToLive = -1; + /** + * The time unit for timeToLive. + */ + private TimeUnit timeUnit = TimeUnit.MILLISECONDS; } @Data diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java index 9fec0b08..07d8b947 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -92,6 +92,7 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst * * @author Spencer Gibb * @author Dave Syer + * @author Bilal Alp */ public class SimpleHostRoutingFilter extends ZuulFilter { @@ -235,7 +236,8 @@ public class SimpleHostRoutingFilter extends ZuulFilter { } final Registry registry = registryBuilder.build(); - this.connectionManager = new PoolingHttpClientConnectionManager(registry); + this.connectionManager = new PoolingHttpClientConnectionManager(registry, null, null, null, + hostProperties.getTimeToLive(), hostProperties.getTimeUnit()); this.connectionManager .setMaxTotal(this.hostProperties.getMaxTotalConnections()); this.connectionManager.setDefaultMaxPerRoute( diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java index 86e32652..daf4b847 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java @@ -19,8 +19,10 @@ package org.springframework.cloud.netflix.zuul.filters.route; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.concurrent.TimeUnit; import java.util.zip.GZIPOutputStream; import javax.servlet.http.HttpServletResponse; @@ -49,6 +51,7 @@ import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.ReflectionUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -87,11 +90,25 @@ public class SimpleHostRoutingFilterTests { @Test public void connectionPropertiesAreApplied() { - addEnvironment(this.context, "zuul.host.maxTotalConnections=100", "zuul.host.maxPerRouteConnections=10"); + addEnvironment(this.context, "zuul.host.maxTotalConnections=100", + "zuul.host.maxPerRouteConnections=10", "zuul.host.timeToLive=5", + "zuul.host.timeUnit=SECONDS"); setupContext(); PoolingHttpClientConnectionManager connMgr = getFilter().newConnectionManager(); assertEquals(100, connMgr.getMaxTotal()); assertEquals(10, connMgr.getDefaultMaxPerRoute()); + Object pool = getField(connMgr, "pool"); + Long timeToLive = getField(pool, "timeToLive"); + TimeUnit timeUnit = getField(pool, "tunit"); + assertEquals(new Long(5), timeToLive); + assertEquals(TimeUnit.SECONDS, timeUnit); + } + + protected T getField(Object target, String name) { + Field field = ReflectionUtils.findField(target.getClass(), name); + ReflectionUtils.makeAccessible(field); + Object value = ReflectionUtils.getField(field, target); + return (T)value; } @Test