我在应用程序中使用Keycloak的java适配器,并希望确保适配器维护的连接池中的所有连接在创建时都具有“保持活动”策略。
是否有办法配置(甚至更改代码)来执行此操作?
答案 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库将更新连接的到期日期,以使最近使用的连接不会被丢弃。