繁体   English   中英

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

[英]“keep-alive” header on connections created by keycloak's java adapter

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

有没有一种方法可以通过配置(甚至更改代码)来做到这一点?

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

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

请记住,如果复用策略未返回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库将更新连接的到期日期,以使最近使用的连接不会被丢弃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM