From cd1f9fc9f787d90b90ed2a099483a89c1e6342b0 Mon Sep 17 00:00:00 2001 From: Oleg Kalnichevski Date: Tue, 15 Apr 2014 10:53:49 +0000 Subject: [PATCH] Support for shared connection managers git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1587507 13f79535-47bb-0310-9956-ffa450edef68 --- .../http/impl/client/HttpClientBuilder.java | 39 ++++++++++++++++++- .../http/impl/client/InternalHttpClient.java | 1 - .../impl/client/TestInternalHttpClient.java | 2 - 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java b/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java index 71602f1ab..3722b4deb 100644 --- a/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java +++ b/httpclient/src/main/java/org/apache/http/impl/client/HttpClientBuilder.java @@ -28,6 +28,7 @@ package org.apache.http.impl.client; import java.io.Closeable; +import java.io.IOException; import java.net.ProxySelector; import java.util.ArrayList; import java.util.Collection; @@ -160,6 +161,7 @@ public class HttpClientBuilder { private LayeredConnectionSocketFactory sslSocketFactory; private SSLContext sslcontext; private HttpClientConnectionManager connManager; + private boolean connManagerShared; private SchemePortResolver schemePortResolver; private ConnectionReuseStrategy reuseStrategy; private ConnectionKeepAliveStrategy keepAliveStrategy; @@ -332,7 +334,26 @@ public final HttpClientBuilder setConnectionTimeToLive(final long connTimeToLive */ public final HttpClientBuilder setConnectionManager( final HttpClientConnectionManager connManager) { + return setConnectionManager(connManager, false); + } + + /** + * Assigns {@link HttpClientConnectionManager} instance. + *

+ * If the connection manager is shared its life-cycle is expected + * to be managed by the caller and it will not be shut down + * if the client is closed. + * + * @param connManager connection manager + * @param shared defines whether or not the connection manager can be shared + * by multiple clients. + * + * @since 4.4 + */ + public final HttpClientBuilder setConnectionManager( + final HttpClientConnectionManager connManager, final boolean shared) { this.connManager = connManager; + this.connManagerShared = shared; return this; } @@ -990,6 +1011,22 @@ public CloseableHttpClient build() { } } + List closeablesCopy = closeables != null ? new ArrayList(closeables) : null; + if (!this.connManagerShared) { + if (closeablesCopy == null) { + closeablesCopy = new ArrayList(1); + } + final HttpClientConnectionManager cm = connManagerCopy; + closeablesCopy.add(new Closeable() { + + @Override + public void close() throws IOException { + cm.shutdown(); + } + + }); + } + return new InternalHttpClient( execChain, connManagerCopy, @@ -999,7 +1036,7 @@ public CloseableHttpClient build() { defaultCookieStore, defaultCredentialsProvider, defaultRequestConfig != null ? defaultRequestConfig : RequestConfig.DEFAULT, - closeables != null ? new ArrayList(closeables) : null); + closeablesCopy); } } diff --git a/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java b/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java index cf0334e81..674f2eda4 100644 --- a/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java +++ b/httpclient/src/main/java/org/apache/http/impl/client/InternalHttpClient.java @@ -189,7 +189,6 @@ protected CloseableHttpResponse doExecute( @Override public void close() { - this.connManager.shutdown(); if (this.closeables != null) { for (final Closeable closeable: this.closeables) { try { diff --git a/httpclient/src/test/java/org/apache/http/impl/client/TestInternalHttpClient.java b/httpclient/src/test/java/org/apache/http/impl/client/TestInternalHttpClient.java index a8bda29b3..200bd9b79 100644 --- a/httpclient/src/test/java/org/apache/http/impl/client/TestInternalHttpClient.java +++ b/httpclient/src/test/java/org/apache/http/impl/client/TestInternalHttpClient.java @@ -188,7 +188,6 @@ public void testExecuteLocalContext() throws Exception { public void testClientClose() throws Exception { client.close(); - Mockito.verify(connManager).shutdown(); Mockito.verify(closeable1).close(); Mockito.verify(closeable2).close(); } @@ -199,7 +198,6 @@ public void testClientCloseIOException() throws Exception { client.close(); - Mockito.verify(connManager).shutdown(); Mockito.verify(closeable1).close(); Mockito.verify(closeable2).close(); }