заголовок "keep-alive" для соединений, созданных Java-адаптером keycloak - PullRequest
0 голосов
/ 28 апреля 2018

Я использую Java-адаптер Keycloak в приложении и хотел бы, чтобы при создании все соединения в пуле соединений, поддерживаемые адаптером, имели стратегию поддержания активности.

Есть ли способ через конфигурацию (или даже изменить код), чтобы сделать это?

1 Ответ

0 голосов
/ 12 апреля 2019

Для тех, кто не хочет разворачивать библиотеку Keycloak, вы можете изменить клиента после того, как KeycloakDeploymentBuilder создаст ваш экземпляр KeycloakDeployment.

Приведенный ниже код вызовет стратегию поддержания активности по умолчанию, равную 60 секундам, пока DefaultConnectionKeepAliveStrategy не найдет значение больше 0 в любых заголовках Keep-Alive, возвращаемых клиенту.

Имейте в виду, что это значение не используется базовым DefaultRequestDirector, если reuseStrategy не возвращает true. Это контролируется заголовком «Connection: keep-alive» в ответе. При необходимости вы также можете создать код для установки значения по умолчанию для reuseStrategy.

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 обновят дату истечения срока действия соединения, чтобы недавно использованные соединения не удалялись.

...