diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index e68ed6d9..241742f2 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -637,36 +637,7 @@ public class GatewayAutoConfiguration { public HttpClient gatewayHttpClient(HttpClientProperties properties, List customizers) { // configure pool resources - HttpClientProperties.Pool pool = properties.getPool(); - - ConnectionProvider connectionProvider; - if (pool.getType() == DISABLED) { - connectionProvider = ConnectionProvider.newConnection(); - } - else if (pool.getType() == FIXED) { - ConnectionProvider.Builder builder = ConnectionProvider.builder(pool.getName()) - .maxConnections(pool.getMaxConnections()).pendingAcquireMaxCount(-1) - .pendingAcquireTimeout(Duration.ofMillis(pool.getAcquireTimeout())); - if (pool.getMaxIdleTime() != null) { - builder.maxIdleTime(pool.getMaxIdleTime()); - } - if (pool.getMaxLifeTime() != null) { - builder.maxLifeTime(pool.getMaxLifeTime()); - } - connectionProvider = builder.build(); - } - else { - ConnectionProvider.Builder builder = ConnectionProvider.builder(pool.getName()) - .maxConnections(Integer.MAX_VALUE).pendingAcquireTimeout(Duration.ofMillis(0)) - .pendingAcquireMaxCount(-1); - if (pool.getMaxIdleTime() != null) { - builder.maxIdleTime(pool.getMaxIdleTime()); - } - if (pool.getMaxLifeTime() != null) { - builder.maxLifeTime(pool.getMaxLifeTime()); - } - connectionProvider = builder.build(); - } + ConnectionProvider connectionProvider = buildConnectionProvider(properties); HttpClient httpClient = HttpClient.create(connectionProvider) // TODO: move customizations to HttpClientCustomizers @@ -754,6 +725,42 @@ public class GatewayAutoConfiguration { return httpClient; } + private ConnectionProvider buildConnectionProvider( + HttpClientProperties properties) { + HttpClientProperties.Pool pool = properties.getPool(); + + ConnectionProvider connectionProvider; + if (pool.getType() == DISABLED) { + connectionProvider = ConnectionProvider.newConnection(); + } + else { + // create either Fixed or Elastic pool + ConnectionProvider.Builder builder = ConnectionProvider + .builder(pool.getName()); + if (pool.getType() == FIXED) { + builder.maxConnections(pool.getMaxConnections()) + .pendingAcquireMaxCount(-1).pendingAcquireTimeout( + Duration.ofMillis(pool.getAcquireTimeout())); + } + else { + // Elastic + builder.maxConnections(Integer.MAX_VALUE) + .pendingAcquireTimeout(Duration.ofMillis(0)) + .pendingAcquireMaxCount(-1); + } + + if (pool.getMaxIdleTime() != null) { + builder.maxIdleTime(pool.getMaxIdleTime()); + } + if (pool.getMaxLifeTime() != null) { + builder.maxLifeTime(pool.getMaxLifeTime()); + } + builder.evictInBackground(pool.getEvictionInterval()); + connectionProvider = builder.build(); + } + return connectionProvider; + } + @Bean public HttpClientProperties httpClientProperties() { return new HttpClientProperties(); diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java index 53d3470b..a7054cd4 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java @@ -211,6 +211,12 @@ public class HttpClientProperties { */ private Duration maxLifeTime = null; + /** + * Perform regular eviction checks in the background at a specified interval. + * Disabled by default ({@link Duration#ZERO}) + */ + private Duration evictionInterval = Duration.ZERO; + public PoolType getType() { return type; } @@ -259,11 +265,19 @@ public class HttpClientProperties { this.maxLifeTime = maxLifeTime; } + public Duration getEvictionInterval() { + return evictionInterval; + } + + public void setEvictionInterval(Duration evictionInterval) { + this.evictionInterval = evictionInterval; + } + @Override public String toString() { return "Pool{" + "type=" + type + ", name='" + name + '\'' + ", maxConnections=" + maxConnections + ", acquireTimeout=" + acquireTimeout + ", maxIdleTime=" + maxIdleTime + ", maxLifeTime=" - + maxLifeTime + '}'; + + maxLifeTime + ", evictionInterval=" + evictionInterval + '}'; } public enum PoolType { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java index 0c8258a0..f34b4d83 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java @@ -97,6 +97,7 @@ public class GatewayAutoConfigurationTests { .withPropertyValues("spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true", "spring.cloud.gateway.httpclient.connect-timeout=10", "spring.cloud.gateway.httpclient.response-timeout=10s", + "spring.cloud.gateway.httpclient.pool.eviction-interval=10s", "spring.cloud.gateway.httpclient.pool.type=fixed", "spring.cloud.gateway.httpclient.compression=true", // greather than integer max value @@ -109,6 +110,7 @@ public class GatewayAutoConfigurationTests { HttpClientProperties properties = context.getBean(HttpClientProperties.class); assertThat(properties.getMaxInitialLineLength().toBytes()).isLessThanOrEqualTo(Integer.MAX_VALUE); assertThat(properties.isCompression()).isEqualTo(true); + assertThat(properties.getPool().getEvictionInterval()).hasSeconds(10); /* * FIXME: 2.1.0 HttpClientOptions options = httpClient.options(); *