keycloak的java适配器创建的连接上的“keep-alive”标头

时间:2018-04-28 06:55:18

标签: java apache-httpclient-4.x keycloak

我在应用程序中使用Keycloak的java适配器,并希望确保适配器维护的连接池中的所有连接在创建时都具有“保持活动”策略。

是否有办法配置(甚至更改代码)来执行此操作?

1 个答案:

答案 0 :(得分:0)

对于不想派发Keycloak库的任何人,您可以在KeycloakDeploymentBuilder构建KeycloakDeployment实例后更改客户端。

下面的代码将导致默认的保持活动策略为60秒,只要DefaultConnectionKeepAliveStrategy在返回给客户端的任何“保持活动”标头中找不到大于0的值。

请记住,如果复用策略未返回true,则底层DefaultRequestDirector不会使用此值。这由响应中的“ Connection:keep-alive”标头控制。如果需要,您还可以创建代码以设置useuseStrategy的默认值。

final KeycloakDeployment keycloakDeployment = KeycloakDeploymentBuilder.build(config);


final long connectionTimeOutSeconds = 60;
final HttpClient client = keycloakDeployment.getClient();
if(client instanceof AbstractHttpClient) {
    ((AbstractHttpClient) client).setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy(connectionTimeOutSeconds));
}

///////////////////////////////////////////////// /////////

import org.apache.http.HttpResponse;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.protocol.HttpContext;

public class CustomConnectionKeepAliveStrategy extends DefaultConnectionKeepAliveStrategy {


   private final long defaultKeepAliveDurationInSeconds;

   public CustomConnectionKeepAliveStrategy(long defaultKeepAliveDurationInSeconds) {
       this.defaultKeepAliveDurationInSeconds = defaultKeepAliveDurationInSeconds;
   }

   @Override
   public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
       long keepAliveDuration = super.getKeepAliveDuration(response, context);

       if(keepAliveDuration > 0) {
           return keepAliveDuration;
       }

       return defaultKeepAliveDurationInSeconds * 1000;
   }
}

还应注意,我使用的Keycloak服务器返回一个Connection:keep-alive标头,因此我的连接已被重用。我的问题是,默认行为是使连接永远存活。这是由于我们使用Kubernetes Ingress的防火墙断开连接而导致的问题,然后我们的应用程序间歇性无法与Keycloak通信。上面的代码使连接过时(在我们的情况下,超过1分钟)被丢弃。底层的Java http库将更新连接的到期日期,以使最近使用的连接不会被丢弃。