无法在 Camel HTTP 组件中配置“Keep Alive”

Mar*_*mer 5 java sockets apache-camel

我在正确设置 HTTP 组件时遇到了一些麻烦。目前,微服务从提供者处提取 JSON 内容,对其进行处理并将其发送到下一个服务以进行进一步处理。主要问题是这个微服务创建了大量的 CLOSE_WAIT 套接字连接。我知道“KEEP-ALIVE”的整个概念将保持连接打开直到我关闭它,但服务器可能会出于某些原因断开连接并创建这个 CLOSE_WAIT 套接字。

我创建了一个用于调试/测试目的的小服务,它向 Google 发出 GET 调用,但即使此连接也保持打开状态,直到我关闭程序。我尝试了许多不同的解决方案:

  • .setHeader("Connection", constant("Close"))
  • -Dhttp.keepAlive=false 作为 VM 参数
  • 从 Camel-Http 切换到 Camel-Http4
  • httpClient.soTimeout=500 (Camel-HTTP)、httpClient.socketTimeout=500 和 connectionTimeToLive=500 (Camel-HTTP4)
  • .setHeader("Connection", simple("Keep-Alive")) 和 .setHeader("Keep-Alive", simple("timeout=10")) (Camel-HTTP4)
  • 通过调试 DefaultConnectionKeepAliveStrategy 从 -1(永无止境)到 Camel-HTTP4 中的特定值的响应进行设置 - 有效,但我无法注入自己的策略。

但我没有成功。所以也许你们中的一个可以帮助我:

  • 我如何告诉 Camel-HTTP 在经过特定时间后它应该关闭连接?例如,该服务每小时从内容提供商那里拉取一次。3-4 小时后,HttpComponent 应该在拉取后关闭连接,并在下一次拉取时重新打开它。目前每个连接都将被放回 MultiThreadedHttpConnectionManager 并且套接字仍然打开。
  • 如果使用 Camel-HTTP 无法做到这一点:如何将 HttpClientBuilder 注入到我的路由的创建中?我知道应该可以通过 httpClient 选项实现,但我不明白文档的特定部分。

谢谢大家的帮助

Mil*_*vić 0

您可以clientConnectionManager向 HTTP4 提供您自己的。通常,您应该使用 的实例,您可以通过将其传递给连接管理器的方法来org.apache.http.impl.conn.PoolingHttpClientConnectionManager配置您自己的实例。org.apache.http.config.SocketConfigsetDefaultSocketConfig

如果您将 Spring 与 Java 配置一起使用,您将有一个方法:

@Bean
PoolingHttpClientConnectionManager connectionManager() {
    SocketConfig socketConfig = SocketConfig.custom()
            .setSoKeepAlive(false)
            .setSoReuseAddress(true)
            .build();
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    connectionManager.setDefaultSocketConfig(socketConfig);
    return connectionManager;
}
Run Code Online (Sandbox Code Playgroud)

然后您只需在端点定义中使用它,如下所示:clientConnectionManager=#connectionManager