我在正确设置 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 选项实现,但我不明白文档的特定部分。
谢谢大家的帮助