当前位置: 首页 > 知识库问答 >
问题:

keydove的java适配器创建的连接上的“keep-alive”头

法玮
2023-03-14

我正在一个应用程序中使用KeyClope的java适配器,并希望确保适配器维护的连接池中的所有连接在创建时都具有“保持活动”策略。

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

共有1个答案

袁飞鹏
2023-03-14

对于任何不想使用keydepose库的人,可以在keydeposeploymentbuilder构建keydepose部署实例后更改客户端。

只要DefaultConnectionKeepAliveStrategy在返回给客户端的任何“keep alive”头中未找到大于0的值,下面的代码将导致60秒的默认keep alive策略。

请记住,如果ReuseStragy未返回true,则基础DefaultRequestDirector不会使用此值。这由响应中的“连接:保持活动”标题控制。如果需要,还可以创建代码来设置ReuseStragy的默认值。

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;
   }
}

还应该注意的是,我使用的KeyClope服务器返回一个Connection:keep-alive头,所以我的连接已经被重用了。我的问题是,默认行为是让连接永远保持活力。这导致了问题,因为我们的Kubernetes入口防火墙正在断开连接,然后我们的应用程序间歇性地无法与Keyclope通信。上面的代码会导致连接过时时被丢弃(在我们的例子中,超过1分钟)。底层的Java http库将更新连接的过期日期,以便最近使用的连接不会被丢弃。

 类似资料:
  • 问题内容: 可以给我打电话吗,如何在Java中创建一个普遍使用的连接器。我对此很陌生,我从不知道要从哪里开始,请告诉我如何为pervasive创建连接器。我创建了示例连接器,但我不确定它是对还是错 问题答案: 这是一个简单的程序,可以连接到PSQL数据库: 要编译它,我使用: 为了运行它,我使用: 如果使用的是64位操作系统,则可能需要更改PSQL JAR文件的位置。

  • 大家好 我的nginx服务器有问题。我已将nginx配置为保持活动连接。 保持活力; 并连接到服务器与持久连接,我发送许多请求到服务器在同一连接。 我想从php关闭持久连接。php退出和死命令关闭响应,而不是连接。客户端可以在同一连接中重新发送到服务器请求。 简单地说,我想关闭从php的持久连接 我用这个命令, 标题(“连接:关闭”); 但未受影响,连接仍然存在 如何从php关闭http连接

  • 然而我这样做,似乎并不奏效: 您知道如何使DefaultHttpClient使用TCP保持活动策略吗?

  • 非标准 这个功能是非标准的,不在标准轨道上。不要在面向 Web 的生产站点上使用它:它不适用于每个用户。实现之间也可能存在很大的不兼容性,并且行为在未来可能会发生变化。 Keep-Alive一般报头允许发送者提示关于如何连接,并且可以被用于设置超时时间,并且请求的最大数量。 Connection头需要被设置为“保活”这个标题有任何意义。此外,Connection和Keep-Alive在 HTTP

  • 我已经实现了一个成熟的节点http服务器,该服务器具有数据库驱动的sesssion管理,并且能够在上面使用Socket.io来实现文件上传进度条和一个聊天应用程序。我还使用了node-http-proxy,并且能够代理WebSockets。在这种背景下,我有以下问题,我认为我需要知道这些问题才能成为一名有效的Socket.io开发人员。我没有被困在任何特定的代码中,但下面所要求的信息是作为一个有效

  • Props: include - 字符串或正则表达式。只有匹配的组件会被缓存。 exclude - 字符串或正则表达式。任何匹配的组件都不会被缓存。 用法: <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。 当组件在 <keep-