Support for shared connection managers
git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1587507 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cb983ea5b0
commit
cd1f9fc9f7
|
@ -28,6 +28,7 @@
|
||||||
package org.apache.http.impl.client;
|
package org.apache.http.impl.client;
|
||||||
|
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.ProxySelector;
|
import java.net.ProxySelector;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -160,6 +161,7 @@ public class HttpClientBuilder {
|
||||||
private LayeredConnectionSocketFactory sslSocketFactory;
|
private LayeredConnectionSocketFactory sslSocketFactory;
|
||||||
private SSLContext sslcontext;
|
private SSLContext sslcontext;
|
||||||
private HttpClientConnectionManager connManager;
|
private HttpClientConnectionManager connManager;
|
||||||
|
private boolean connManagerShared;
|
||||||
private SchemePortResolver schemePortResolver;
|
private SchemePortResolver schemePortResolver;
|
||||||
private ConnectionReuseStrategy reuseStrategy;
|
private ConnectionReuseStrategy reuseStrategy;
|
||||||
private ConnectionKeepAliveStrategy keepAliveStrategy;
|
private ConnectionKeepAliveStrategy keepAliveStrategy;
|
||||||
|
@ -332,7 +334,26 @@ public class HttpClientBuilder {
|
||||||
*/
|
*/
|
||||||
public final HttpClientBuilder setConnectionManager(
|
public final HttpClientBuilder setConnectionManager(
|
||||||
final HttpClientConnectionManager connManager) {
|
final HttpClientConnectionManager connManager) {
|
||||||
|
return setConnectionManager(connManager, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assigns {@link HttpClientConnectionManager} instance.
|
||||||
|
* <p/>
|
||||||
|
* 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.connManager = connManager;
|
||||||
|
this.connManagerShared = shared;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,6 +1011,22 @@ public class HttpClientBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Closeable> closeablesCopy = closeables != null ? new ArrayList<Closeable>(closeables) : null;
|
||||||
|
if (!this.connManagerShared) {
|
||||||
|
if (closeablesCopy == null) {
|
||||||
|
closeablesCopy = new ArrayList<Closeable>(1);
|
||||||
|
}
|
||||||
|
final HttpClientConnectionManager cm = connManagerCopy;
|
||||||
|
closeablesCopy.add(new Closeable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
cm.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return new InternalHttpClient(
|
return new InternalHttpClient(
|
||||||
execChain,
|
execChain,
|
||||||
connManagerCopy,
|
connManagerCopy,
|
||||||
|
@ -999,7 +1036,7 @@ public class HttpClientBuilder {
|
||||||
defaultCookieStore,
|
defaultCookieStore,
|
||||||
defaultCredentialsProvider,
|
defaultCredentialsProvider,
|
||||||
defaultRequestConfig != null ? defaultRequestConfig : RequestConfig.DEFAULT,
|
defaultRequestConfig != null ? defaultRequestConfig : RequestConfig.DEFAULT,
|
||||||
closeables != null ? new ArrayList<Closeable>(closeables) : null);
|
closeablesCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,7 +189,6 @@ class InternalHttpClient extends CloseableHttpClient {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
this.connManager.shutdown();
|
|
||||||
if (this.closeables != null) {
|
if (this.closeables != null) {
|
||||||
for (final Closeable closeable: this.closeables) {
|
for (final Closeable closeable: this.closeables) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -188,7 +188,6 @@ public class TestInternalHttpClient {
|
||||||
public void testClientClose() throws Exception {
|
public void testClientClose() throws Exception {
|
||||||
client.close();
|
client.close();
|
||||||
|
|
||||||
Mockito.verify(connManager).shutdown();
|
|
||||||
Mockito.verify(closeable1).close();
|
Mockito.verify(closeable1).close();
|
||||||
Mockito.verify(closeable2).close();
|
Mockito.verify(closeable2).close();
|
||||||
}
|
}
|
||||||
|
@ -199,7 +198,6 @@ public class TestInternalHttpClient {
|
||||||
|
|
||||||
client.close();
|
client.close();
|
||||||
|
|
||||||
Mockito.verify(connManager).shutdown();
|
|
||||||
Mockito.verify(closeable1).close();
|
Mockito.verify(closeable1).close();
|
||||||
Mockito.verify(closeable2).close();
|
Mockito.verify(closeable2).close();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue