Skip to content

Commit ca94e33

Browse files
committed
Allow configuring http connection pool size
See: #1466
1 parent c3661f3 commit ca94e33

File tree

5 files changed

+72
-29
lines changed

5 files changed

+72
-29
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
.project
77
.settings
88
.classpath
9+
.factorypath
910

1011
# Ignore all build/dist directories
1112
target

docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClient.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public static final class Builder {
1313

1414
private SSLConfig sslConfig = null;
1515

16+
private ConnectionPoolConfig connectionPoolConf = null;
17+
1618
public Builder dockerHost(URI value) {
1719
this.dockerHost = Objects.requireNonNull(value, "dockerHost");
1820
return this;
@@ -23,13 +25,18 @@ public Builder sslConfig(SSLConfig value) {
2325
return this;
2426
}
2527

28+
public Builder connectionPool(ConnectionPoolConfig conf) {
29+
this.connectionPoolConf = conf;
30+
return this;
31+
}
32+
2633
public ApacheDockerHttpClient build() {
2734
Objects.requireNonNull(dockerHost, "dockerHost");
28-
return new ApacheDockerHttpClient(dockerHost, sslConfig);
35+
return new ApacheDockerHttpClient(dockerHost, sslConfig, connectionPoolConf);
2936
}
3037
}
3138

32-
private ApacheDockerHttpClient(URI dockerHost, SSLConfig sslConfig) {
33-
super(dockerHost, sslConfig);
39+
private ApacheDockerHttpClient(URI dockerHost, SSLConfig sslConfig, ConnectionPoolConfig connectionPoolConfig) {
40+
super(dockerHost, sslConfig, connectionPoolConfig);
3441
}
3542
}

docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@
4141
class ApacheDockerHttpClientImpl implements DockerHttpClient {
4242

4343
private final CloseableHttpClient httpClient;
44-
4544
private final HttpHost host;
4645

4746
protected ApacheDockerHttpClientImpl(
4847
URI dockerHost,
49-
SSLConfig sslConfig
48+
SSLConfig sslConfig,
49+
ConnectionPoolConfig connectionPoolConf
5050
) {
5151
Registry<ConnectionSocketFactory> socketFactoryRegistry = createConnectionSocketFactoryRegistry(sslConfig, dockerHost);
5252

@@ -66,27 +66,35 @@ protected ApacheDockerHttpClientImpl(
6666
host = HttpHost.create(dockerHost);
6767
}
6868

69+
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(
70+
socketFactoryRegistry,
71+
new ManagedHttpClientConnectionFactory(
72+
null,
73+
null,
74+
null,
75+
null,
76+
message -> {
77+
Header transferEncodingHeader = message.getFirstHeader(HttpHeaders.TRANSFER_ENCODING);
78+
if (transferEncodingHeader != null) {
79+
if ("identity".equalsIgnoreCase(transferEncodingHeader.getValue())) {
80+
return ContentLengthStrategy.UNDEFINED;
81+
}
82+
}
83+
return DefaultContentLengthStrategy.INSTANCE.determineLength(message);
84+
},
85+
null
86+
)
87+
);
88+
if (connectionPoolConf != null) {
89+
Integer maxConnections = connectionPoolConf.getMaxConnections();
90+
if (maxConnections != null) {
91+
connectionManager.setMaxTotal(maxConnections);
92+
connectionManager.setDefaultMaxPerRoute(maxConnections);
93+
}
94+
}
6995
httpClient = HttpClients.custom()
7096
.setRequestExecutor(new HijackingHttpRequestExecutor(null))
71-
.setConnectionManager(new PoolingHttpClientConnectionManager(
72-
socketFactoryRegistry,
73-
new ManagedHttpClientConnectionFactory(
74-
null,
75-
null,
76-
null,
77-
null,
78-
message -> {
79-
Header transferEncodingHeader = message.getFirstHeader(HttpHeaders.TRANSFER_ENCODING);
80-
if (transferEncodingHeader != null) {
81-
if ("identity".equalsIgnoreCase(transferEncodingHeader.getValue())) {
82-
return ContentLengthStrategy.UNDEFINED;
83-
}
84-
}
85-
return DefaultContentLengthStrategy.INSTANCE.determineLength(message);
86-
},
87-
null
88-
)
89-
))
97+
.setConnectionManager(connectionManager)
9098
.build();
9199
}
92100

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.github.dockerjava.httpclient5;
2+
3+
public class ConnectionPoolConfig {
4+
5+
private Integer maxConnections;
6+
7+
public Integer getMaxConnections() {
8+
return maxConnections;
9+
}
10+
11+
public ConnectionPoolConfig setMaxConnections(Integer maxConnections) {
12+
this.maxConnections = maxConnections;
13+
return this;
14+
}
15+
16+
@Override
17+
public String toString() {
18+
return "ConnectionPoolConfig [maxConnections=" + maxConnections + "]";
19+
}
20+
}
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.github.dockerjava.httpclient5;
22

3-
import com.github.dockerjava.transport.SSLConfig;
4-
53
import java.net.URI;
64
import java.util.Objects;
75

6+
import com.github.dockerjava.transport.SSLConfig;
7+
88
@SuppressWarnings("unused")
99
public final class ZerodepDockerHttpClient extends ApacheDockerHttpClientImpl {
1010

@@ -14,6 +14,8 @@ public static final class Builder {
1414

1515
private SSLConfig sslConfig = null;
1616

17+
private ConnectionPoolConfig connectionPoolConfig = null;
18+
1719
public Builder dockerHost(URI value) {
1820
this.dockerHost = Objects.requireNonNull(value, "dockerHost");
1921
return this;
@@ -24,13 +26,18 @@ public Builder sslConfig(SSLConfig value) {
2426
return this;
2527
}
2628

29+
public Builder connectionPool(ConnectionPoolConfig conf) {
30+
this.connectionPoolConfig = conf;
31+
return this;
32+
}
33+
2734
public ZerodepDockerHttpClient build() {
2835
Objects.requireNonNull(dockerHost, "dockerHost");
29-
return new ZerodepDockerHttpClient(dockerHost, sslConfig);
36+
return new ZerodepDockerHttpClient(dockerHost, sslConfig, connectionPoolConfig);
3037
}
3138
}
3239

33-
protected ZerodepDockerHttpClient(URI dockerHost, SSLConfig sslConfig) {
34-
super(dockerHost, sslConfig);
40+
protected ZerodepDockerHttpClient(URI dockerHost, SSLConfig sslConfig, ConnectionPoolConfig connectionPoolConf) {
41+
super(dockerHost, sslConfig, connectionPoolConf);
3542
}
3643
}

0 commit comments

Comments
 (0)