Skip to content

Commit 7746feb

Browse files
Florian Tavaresok2c
authored andcommitted
Add a method in PoolingHttpClientConnectionManagerBuilder/PoolingAsyncClientConnectionManagerBuilder to configure a listener for connection pool events (onLease/onRelease)
This can be use to implement custom instrumentation (time blocked in http pool for example)
1 parent c63ea8e commit 7746feb

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import org.apache.hc.core5.http.protocol.HttpContext;
7272
import org.apache.hc.core5.io.CloseMode;
7373
import org.apache.hc.core5.pool.ConnPoolControl;
74+
import org.apache.hc.core5.pool.ConnPoolListener;
7475
import org.apache.hc.core5.pool.DefaultDisposalCallback;
7576
import org.apache.hc.core5.pool.DisposalCallback;
7677
import org.apache.hc.core5.pool.LaxConnPool;
@@ -136,6 +137,7 @@ public PoolingHttpClientConnectionManager() {
136137
PoolConcurrencyPolicy.STRICT,
137138
PoolReusePolicy.LIFO,
138139
TimeValue.NEG_ONE_MILLISECOND,
140+
null,
139141
null);
140142
}
141143

@@ -211,6 +213,7 @@ public PoolingHttpClientConnectionManager(
211213
poolConcurrencyPolicy,
212214
poolReusePolicy,
213215
timeToLive,
216+
null,
214217
connFactory);
215218
}
216219

@@ -220,8 +223,9 @@ public PoolingHttpClientConnectionManager(
220223
final PoolConcurrencyPolicy poolConcurrencyPolicy,
221224
final PoolReusePolicy poolReusePolicy,
222225
final TimeValue timeToLive,
226+
final ConnPoolListener<HttpRoute> connPoolListener,
223227
final HttpConnectionFactory<ManagedHttpClientConnection> connFactory) {
224-
this(httpClientConnectionOperator,poolConcurrencyPolicy,poolReusePolicy,timeToLive,connFactory,false);
228+
this(httpClientConnectionOperator,poolConcurrencyPolicy,poolReusePolicy,timeToLive,connPoolListener,connFactory,false);
225229

226230
}
227231

@@ -231,6 +235,7 @@ public PoolingHttpClientConnectionManager(
231235
final PoolConcurrencyPolicy poolConcurrencyPolicy,
232236
final PoolReusePolicy poolReusePolicy,
233237
final TimeValue timeToLive,
238+
final ConnPoolListener<HttpRoute> connPoolListener,
234239
final HttpConnectionFactory<ManagedHttpClientConnection> connFactory,
235240
final boolean offLockDisposalEnabled) {
236241
super();
@@ -249,7 +254,7 @@ public PoolingHttpClientConnectionManager(
249254
timeToLive,
250255
poolReusePolicy,
251256
callbackForPool,
252-
null) {
257+
connPoolListener) {
253258

254259
@Override
255260
public void closeExpired() {
@@ -264,7 +269,7 @@ public void closeExpired() {
264269
timeToLive,
265270
poolReusePolicy,
266271
callbackForPool,
267-
null) {
272+
connPoolListener) {
268273

269274
@Override
270275
public void closeExpired() {
@@ -280,6 +285,7 @@ public void closeExpired() {
280285
timeToLive,
281286
poolReusePolicy,
282287
new DefaultDisposalCallback<>());
288+
// TODO : wire connPoolListener here once `RouteSegmentedConnPool` supports it.
283289
break;
284290
default:
285291
throw new IllegalArgumentException("Unexpected PoolConcurrencyPolicy value: " + poolConcurrencyPolicy);

httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.hc.core5.http.io.HttpConnectionFactory;
4848
import org.apache.hc.core5.http.io.SocketConfig;
4949
import org.apache.hc.core5.io.CloseMode;
50+
import org.apache.hc.core5.pool.ConnPoolListener;
5051
import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
5152
import org.apache.hc.core5.pool.PoolReusePolicy;
5253
import org.apache.hc.core5.util.TimeValue;
@@ -94,6 +95,8 @@ public class PoolingHttpClientConnectionManagerBuilder {
9495
private int maxConnTotal;
9596
private int maxConnPerRoute;
9697

98+
private ConnPoolListener<HttpRoute> connPoolListener;
99+
97100
private boolean offLockDisposalEnabled;
98101

99102
public static PoolingHttpClientConnectionManagerBuilder create() {
@@ -200,6 +203,18 @@ public final PoolingHttpClientConnectionManagerBuilder setMaxConnPerRoute(final
200203
return this;
201204
}
202205

206+
/**
207+
* Sets a {@link ConnPoolListener}.
208+
* This can be used to subscribe to underlying connection pool events (if it supports it).
209+
*
210+
* @return this instance.
211+
* @since 5.7
212+
*/
213+
public final PoolingHttpClientConnectionManagerBuilder setConnPoolListener(final ConnPoolListener<HttpRoute> connPoolListener) {
214+
this.connPoolListener = connPoolListener;
215+
return this;
216+
}
217+
203218
/**
204219
* Sets the same {@link SocketConfig} for all routes.
205220
*
@@ -357,6 +372,7 @@ public PoolingHttpClientConnectionManager build() {
357372
poolConcurrencyPolicy,
358373
poolReusePolicy,
359374
null,
375+
connPoolListener,
360376
connectionFactory,
361377
offLockDisposalEnabled);
362378
poolingmgr.setSocketConfigResolver(socketConfigResolver);

httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.apache.hc.core5.http2.ssl.ApplicationProtocol;
8080
import org.apache.hc.core5.io.CloseMode;
8181
import org.apache.hc.core5.pool.ConnPoolControl;
82+
import org.apache.hc.core5.pool.ConnPoolListener;
8283
import org.apache.hc.core5.pool.DefaultDisposalCallback;
8384
import org.apache.hc.core5.pool.LaxConnPool;
8485
import org.apache.hc.core5.pool.ManagedConnPool;
@@ -166,7 +167,7 @@ public PoolingAsyncClientConnectionManager(
166167
final SchemePortResolver schemePortResolver,
167168
final DnsResolver dnsResolver) {
168169
this(new DefaultAsyncClientConnectionOperator(tlsStrategyLookup, schemePortResolver, dnsResolver),
169-
poolConcurrencyPolicy, poolReusePolicy, timeToLive, false);
170+
poolConcurrencyPolicy, poolReusePolicy, timeToLive, null, false);
170171
}
171172

172173
@Internal
@@ -175,6 +176,7 @@ public PoolingAsyncClientConnectionManager(
175176
final PoolConcurrencyPolicy poolConcurrencyPolicy,
176177
final PoolReusePolicy poolReusePolicy,
177178
final TimeValue timeToLive,
179+
final ConnPoolListener<HttpRoute> connPoolListener,
178180
final boolean messageMultiplexing) {
179181
this.connectionOperator = Args.notNull(connectionOperator, "Connection operator");
180182
final ManagedConnPool<HttpRoute, ManagedAsyncClientConnection> managedConnPool;
@@ -186,7 +188,7 @@ public PoolingAsyncClientConnectionManager(
186188
timeToLive,
187189
poolReusePolicy,
188190
new DefaultDisposalCallback<>(),
189-
null) {
191+
connPoolListener) {
190192

191193
@Override
192194
public void closeExpired() {
@@ -200,7 +202,7 @@ public void closeExpired() {
200202
DEFAULT_MAX_CONNECTIONS_PER_ROUTE,
201203
timeToLive,
202204
poolReusePolicy,
203-
null) {
205+
connPoolListener) {
204206

205207
@Override
206208
public void closeExpired() {
@@ -216,6 +218,7 @@ public void closeExpired() {
216218
timeToLive,
217219
poolReusePolicy,
218220
new DefaultDisposalCallback<>());
221+
// TODO : wire connPoolListener here once `RouteSegmentedConnPool` supports it.
219222
break;
220223
default:
221224
throw new IllegalArgumentException("Unexpected PoolConcurrencyPolicy value: " + poolConcurrencyPolicy);

httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.apache.hc.core5.http.URIScheme;
4343
import org.apache.hc.core5.http.config.RegistryBuilder;
4444
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
45+
import org.apache.hc.core5.pool.ConnPoolListener;
4546
import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
4647
import org.apache.hc.core5.pool.PoolReusePolicy;
4748
import org.apache.hc.core5.util.ReflectionUtils;
@@ -86,6 +87,8 @@ public class PoolingAsyncClientConnectionManagerBuilder {
8687
private int maxConnTotal;
8788
private int maxConnPerRoute;
8889

90+
private ConnPoolListener<HttpRoute> connPoolListener;
91+
8992
private Resolver<HttpRoute, ConnectionConfig> connectionConfigResolver;
9093
private Resolver<HttpHost, TlsConfig> tlsConfigResolver;
9194
private boolean messageMultiplexing;
@@ -170,6 +173,18 @@ public final PoolingAsyncClientConnectionManagerBuilder setMaxConnPerRoute(final
170173
return this;
171174
}
172175

176+
/**
177+
* Sets a {@link ConnPoolListener}.
178+
* This can be used to subscribe to underlying connection pool events (if it supports it).
179+
*
180+
* @return this instance.
181+
* @since 5.7
182+
*/
183+
public final PoolingAsyncClientConnectionManagerBuilder setConnPoolListener(final ConnPoolListener<HttpRoute> connPoolListener) {
184+
this.connPoolListener = connPoolListener;
185+
return this;
186+
}
187+
173188
/**
174189
* Sets the same {@link ConnectionConfig} for all routes.
175190
*
@@ -311,6 +326,7 @@ public PoolingAsyncClientConnectionManager build() {
311326
poolConcurrencyPolicy,
312327
poolReusePolicy,
313328
null,
329+
connPoolListener,
314330
messageMultiplexing);
315331
poolingmgr.setConnectionConfigResolver(connectionConfigResolver);
316332
poolingmgr.setTlsConfigResolver(tlsConfigResolver);

0 commit comments

Comments
 (0)