[英]Tomcat, HTTP Keep-Alive and Java's HttpsUrlConnection
[英]“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.