Details
diff --git a/docbook/auth-server-docs/reference/en/en-US/modules/server-installation.xml b/docbook/auth-server-docs/reference/en/en-US/modules/server-installation.xml
index edf3f36..10b0ec4 100755
--- a/docbook/auth-server-docs/reference/en/en-US/modules/server-installation.xml
+++ b/docbook/auth-server-docs/reference/en/en-US/modules/server-installation.xml
@@ -396,7 +396,7 @@ bin/add-user.[sh|bat] -r master -u <username> -p <password>
<term>connection-pool-size</term>
<listitem>
<para>
- How many connections can be in the pool.
+ How many connections can be in the pool (200 by default).
</para>
</listitem>
</varlistentry>
@@ -404,7 +404,23 @@ bin/add-user.[sh|bat] -r master -u <username> -p <password>
<term>max-pooled-per-route</term>
<listitem>
<para>
- How many connections can be pooled per host.
+ How many connections can be pooled per host (100 by default).
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>connection-ttl-millis</term>
+ <listitem>
+ <para>
+ Maximum connection time to live in milliseconds
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>max-connection-idle-time-millis</term>
+ <listitem>
+ <para>
+ Maximum time the connection might stay idle in the connection pool. Will start background cleaner thread if set (by default it's not set)
</para>
</listitem>
</varlistentry>
diff --git a/services/src/main/java/org/keycloak/connections/httpclient/DefaultHttpClientFactory.java b/services/src/main/java/org/keycloak/connections/httpclient/DefaultHttpClientFactory.java
index 471b32b..430da72 100755
--- a/services/src/main/java/org/keycloak/connections/httpclient/DefaultHttpClientFactory.java
+++ b/services/src/main/java/org/keycloak/connections/httpclient/DefaultHttpClientFactory.java
@@ -119,8 +119,10 @@ public class DefaultHttpClientFactory implements HttpClientFactory {
if (httpClient == null) {
long socketTimeout = config.getLong("socket-timeout-millis", -1L);
long establishConnectionTimeout = config.getLong("establish-connection-timeout-millis", -1L);
- int maxPooledPerRoute = config.getInt("max-pooled-per-route", 0);
+ int maxPooledPerRoute = config.getInt("max-pooled-per-route", 100);
int connectionPoolSize = config.getInt("connection-pool-size", 200);
+ long connectionTTL = config.getLong("connection-ttl-millis", -1L);
+ long maxConnectionIdleTime = config.getLong("max-connection-idle-time-millis", -1L);
boolean disableCookies = config.getBoolean("disable-cookies", true);
String clientKeystore = config.get("client-keystore");
String clientKeystorePassword = config.get("client-keystore-password");
@@ -139,6 +141,8 @@ public class DefaultHttpClientFactory implements HttpClientFactory {
.establishConnectionTimeout(establishConnectionTimeout, TimeUnit.MILLISECONDS)
.maxPooledPerRoute(maxPooledPerRoute)
.connectionPoolSize(connectionPoolSize)
+ .connectionTTL(connectionTTL, TimeUnit.MILLISECONDS)
+ .maxConnectionIdleTime(maxConnectionIdleTime, TimeUnit.MILLISECONDS)
.disableCookies(disableCookies);
if (disableTrustManager) {
diff --git a/services/src/main/java/org/keycloak/connections/httpclient/HttpClientBuilder.java b/services/src/main/java/org/keycloak/connections/httpclient/HttpClientBuilder.java
index 8c5dd4b..ba727bd 100755
--- a/services/src/main/java/org/keycloak/connections/httpclient/HttpClientBuilder.java
+++ b/services/src/main/java/org/keycloak/connections/httpclient/HttpClientBuilder.java
@@ -92,10 +92,12 @@ public class HttpClientBuilder {
protected boolean disableTrustManager;
protected HostnameVerificationPolicy policy = HostnameVerificationPolicy.WILDCARD;
protected SSLContext sslContext;
- protected int connectionPoolSize = 100;
- protected int maxPooledPerRoute = 0;
+ protected int connectionPoolSize = 200;
+ protected int maxPooledPerRoute = 100;
protected long connectionTTL = -1;
protected TimeUnit connectionTTLUnit = TimeUnit.MILLISECONDS;
+ protected long maxConnectionIdleTime = -1;
+ protected TimeUnit maxConnectionIdleTimeUnit = TimeUnit.MILLISECONDS;
protected HostnameVerifier verifier = null;
protected long socketTimeout = -1;
protected TimeUnit socketTimeoutUnits = TimeUnit.MILLISECONDS;
@@ -138,6 +140,12 @@ public class HttpClientBuilder {
return this;
}
+ public HttpClientBuilder maxConnectionIdleTime(long maxConnectionIdleTime, TimeUnit unit) {
+ this.maxConnectionIdleTime = maxConnectionIdleTime;
+ this.maxConnectionIdleTimeUnit = unit;
+ return this;
+ }
+
public HttpClientBuilder maxPooledPerRoute(int maxPooledPerRoute) {
this.maxPooledPerRoute = maxPooledPerRoute;
return this;
@@ -272,7 +280,14 @@ public class HttpClientBuilder {
.setDefaultRequestConfig(requestConfig)
.setSSLSocketFactory(sslsf)
.setMaxConnTotal(connectionPoolSize)
- .setMaxConnPerRoute(maxPooledPerRoute);
+ .setMaxConnPerRoute(maxPooledPerRoute)
+ .setConnectionTimeToLive(connectionTTL, connectionTTLUnit);
+
+ if (maxConnectionIdleTime > 0) {
+ // Will start background cleaner thread
+ builder.evictIdleConnections(maxConnectionIdleTime, maxConnectionIdleTimeUnit);
+ }
+
if (disableCookies) builder.disableCookieManagement();
return builder.build();
} catch (Exception e) {