diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java index 3604268db7..1e464d7386 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java @@ -71,6 +71,7 @@ import org.apache.hc.core5.http.protocol.HttpContext; import org.apache.hc.core5.io.CloseMode; import org.apache.hc.core5.pool.ConnPoolControl; +import org.apache.hc.core5.pool.ConnPoolListener; import org.apache.hc.core5.pool.DefaultDisposalCallback; import org.apache.hc.core5.pool.DisposalCallback; import org.apache.hc.core5.pool.LaxConnPool; @@ -136,6 +137,7 @@ public PoolingHttpClientConnectionManager() { PoolConcurrencyPolicy.STRICT, PoolReusePolicy.LIFO, TimeValue.NEG_ONE_MILLISECOND, + null, null); } @@ -211,6 +213,7 @@ public PoolingHttpClientConnectionManager( poolConcurrencyPolicy, poolReusePolicy, timeToLive, + null, connFactory); } @@ -220,8 +223,9 @@ public PoolingHttpClientConnectionManager( final PoolConcurrencyPolicy poolConcurrencyPolicy, final PoolReusePolicy poolReusePolicy, final TimeValue timeToLive, + final ConnPoolListener connPoolListener, final HttpConnectionFactory connFactory) { - this(httpClientConnectionOperator,poolConcurrencyPolicy,poolReusePolicy,timeToLive,connFactory,false); + this(httpClientConnectionOperator,poolConcurrencyPolicy,poolReusePolicy,timeToLive,connPoolListener,connFactory,false); } @@ -231,6 +235,7 @@ public PoolingHttpClientConnectionManager( final PoolConcurrencyPolicy poolConcurrencyPolicy, final PoolReusePolicy poolReusePolicy, final TimeValue timeToLive, + final ConnPoolListener connPoolListener, final HttpConnectionFactory connFactory, final boolean offLockDisposalEnabled) { super(); @@ -249,7 +254,7 @@ public PoolingHttpClientConnectionManager( timeToLive, poolReusePolicy, callbackForPool, - null) { + connPoolListener) { @Override public void closeExpired() { @@ -264,7 +269,7 @@ public void closeExpired() { timeToLive, poolReusePolicy, callbackForPool, - null) { + connPoolListener) { @Override public void closeExpired() { @@ -280,6 +285,7 @@ public void closeExpired() { timeToLive, poolReusePolicy, new DefaultDisposalCallback<>()); + // TODO : wire connPoolListener here once `RouteSegmentedConnPool` supports it. break; default: throw new IllegalArgumentException("Unexpected PoolConcurrencyPolicy value: " + poolConcurrencyPolicy); diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java index 9b7e6adb71..ae62bdbe8f 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java @@ -47,6 +47,7 @@ import org.apache.hc.core5.http.io.HttpConnectionFactory; import org.apache.hc.core5.http.io.SocketConfig; import org.apache.hc.core5.io.CloseMode; +import org.apache.hc.core5.pool.ConnPoolListener; import org.apache.hc.core5.pool.PoolConcurrencyPolicy; import org.apache.hc.core5.pool.PoolReusePolicy; import org.apache.hc.core5.util.TimeValue; @@ -94,6 +95,8 @@ public class PoolingHttpClientConnectionManagerBuilder { private int maxConnTotal; private int maxConnPerRoute; + private ConnPoolListener connPoolListener; + private boolean offLockDisposalEnabled; public static PoolingHttpClientConnectionManagerBuilder create() { @@ -200,6 +203,18 @@ public final PoolingHttpClientConnectionManagerBuilder setMaxConnPerRoute(final return this; } + /** + * Sets a {@link ConnPoolListener}. + * This can be used to subscribe to underlying connection pool events (if it supports it). + * + * @return this instance. + * @since 5.7 + */ + public final PoolingHttpClientConnectionManagerBuilder setConnPoolListener(final ConnPoolListener connPoolListener) { + this.connPoolListener = connPoolListener; + return this; + } + /** * Sets the same {@link SocketConfig} for all routes. * @@ -357,6 +372,7 @@ public PoolingHttpClientConnectionManager build() { poolConcurrencyPolicy, poolReusePolicy, null, + connPoolListener, connectionFactory, offLockDisposalEnabled); poolingmgr.setSocketConfigResolver(socketConfigResolver); diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java index 6078a92352..48180774b2 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java @@ -79,6 +79,7 @@ import org.apache.hc.core5.http2.ssl.ApplicationProtocol; import org.apache.hc.core5.io.CloseMode; import org.apache.hc.core5.pool.ConnPoolControl; +import org.apache.hc.core5.pool.ConnPoolListener; import org.apache.hc.core5.pool.DefaultDisposalCallback; import org.apache.hc.core5.pool.LaxConnPool; import org.apache.hc.core5.pool.ManagedConnPool; @@ -166,7 +167,7 @@ public PoolingAsyncClientConnectionManager( final SchemePortResolver schemePortResolver, final DnsResolver dnsResolver) { this(new DefaultAsyncClientConnectionOperator(tlsStrategyLookup, schemePortResolver, dnsResolver), - poolConcurrencyPolicy, poolReusePolicy, timeToLive, false); + poolConcurrencyPolicy, poolReusePolicy, timeToLive, null, false); } @Internal @@ -175,6 +176,7 @@ public PoolingAsyncClientConnectionManager( final PoolConcurrencyPolicy poolConcurrencyPolicy, final PoolReusePolicy poolReusePolicy, final TimeValue timeToLive, + final ConnPoolListener connPoolListener, final boolean messageMultiplexing) { this.connectionOperator = Args.notNull(connectionOperator, "Connection operator"); final ManagedConnPool managedConnPool; @@ -186,7 +188,7 @@ public PoolingAsyncClientConnectionManager( timeToLive, poolReusePolicy, new DefaultDisposalCallback<>(), - null) { + connPoolListener) { @Override public void closeExpired() { @@ -200,7 +202,7 @@ public void closeExpired() { DEFAULT_MAX_CONNECTIONS_PER_ROUTE, timeToLive, poolReusePolicy, - null) { + connPoolListener) { @Override public void closeExpired() { @@ -216,6 +218,7 @@ public void closeExpired() { timeToLive, poolReusePolicy, new DefaultDisposalCallback<>()); + // TODO : wire connPoolListener here once `RouteSegmentedConnPool` supports it. break; default: throw new IllegalArgumentException("Unexpected PoolConcurrencyPolicy value: " + poolConcurrencyPolicy); diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java index f6c93457d9..0a30435268 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java @@ -42,6 +42,7 @@ import org.apache.hc.core5.http.URIScheme; import org.apache.hc.core5.http.config.RegistryBuilder; import org.apache.hc.core5.http.nio.ssl.TlsStrategy; +import org.apache.hc.core5.pool.ConnPoolListener; import org.apache.hc.core5.pool.PoolConcurrencyPolicy; import org.apache.hc.core5.pool.PoolReusePolicy; import org.apache.hc.core5.util.ReflectionUtils; @@ -86,6 +87,8 @@ public class PoolingAsyncClientConnectionManagerBuilder { private int maxConnTotal; private int maxConnPerRoute; + private ConnPoolListener connPoolListener; + private Resolver connectionConfigResolver; private Resolver tlsConfigResolver; private boolean messageMultiplexing; @@ -170,6 +173,18 @@ public final PoolingAsyncClientConnectionManagerBuilder setMaxConnPerRoute(final return this; } + /** + * Sets a {@link ConnPoolListener}. + * This can be used to subscribe to underlying connection pool events (if it supports it). + * + * @return this instance. + * @since 5.7 + */ + public final PoolingAsyncClientConnectionManagerBuilder setConnPoolListener(final ConnPoolListener connPoolListener) { + this.connPoolListener = connPoolListener; + return this; + } + /** * Sets the same {@link ConnectionConfig} for all routes. * @@ -311,6 +326,7 @@ public PoolingAsyncClientConnectionManager build() { poolConcurrencyPolicy, poolReusePolicy, null, + connPoolListener, messageMultiplexing); poolingmgr.setConnectionConfigResolver(connectionConfigResolver); poolingmgr.setTlsConfigResolver(tlsConfigResolver);