簡體   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