Apache Camel https4客户端未对keepAlive = true的多个请求使用相同的tcp端口

时间:2018-10-31 11:32:35

标签: https apache-camel keep-alive

嗨,我正在使用Apache骆驼 http4组件通过keepAlive=true发送 https 请求,但是在发送多个请求后看到netstat我看到每个请求都会为对等方打开一个新的 TCP端口
我觉得这不应该是 keepAlive事务的通常行为,为什么不能重用与服务器进行通信的同一个TCP端口,以及如何才能实现?可以。

2 个答案:

答案 0 :(得分:1)

事实证明这不是一个活着的问题;实际上,连接可以保持适当的状态。问题是作为默认PoolingHttpClientConnectionManager管理的池的一部分的连接没有被重用。通过为Apache的HttpClient(在幕后使用)启用日志记录,可以很容易地看到这两件事:

正在使用“保持活动”:

2018/12/19 07:59:17:470 CET [DEBUG]线-http-outgoing-7 <<“ HTTP / 1.1 200 OK [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]电汇-http-outgoing-7 <<“保持活动:超时= 5,最大= 300 [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]电汇-http-outgoing-7 <<“服务器:Apache-Coyote / 1.1 [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]电汇-http-outgoing-7 <<“ Content-Encoding:gzip [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]电汇-http-outgoing-7 <<“ Vary:Accept-Encoding [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]线-http-outgoing-7 <<“ Cluster-Id:A [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]电汇-http-outgoing-7 <<“日期:2018年12月19日星期三06:59:17 GMT [\ r] [\ n]” 2018/12/19 07:59:17:470 CET [DEBUG]电汇-http-outgoing-7 <<“ Content-Type:text / xml [\ r] [\ n]” 2018/12/19 07:59:17:471 CET [DEBUG]电汇-http-outgoing-7 <<“ Content-Length:239 [\ r] [\ n]” 2018/12/19 07:59:17:471 CET [DEBUG]线-http-outgoing-7 <<“ [\ r] [\ n]” 连接未被重用:

2018/12/19 08:00:08:240 CET [DEBUG] PoolingHttpClientConnectionManager-连接请求:[路由:{s}-> https://someurl.com:443][total保持活动状态:1;分配的路线:1(共1);分配的总数:1/1] 2018/12/19 08:00:08:240 CET [DEBUG] DefaultManagedHttpClientConnection-http-outgoing-7:关闭连接 2018/12/19 08:00:08:242 CET [DEBUG] PoolingHttpClientConnectionManager-租借的连接:[id:8] [路由:{s}-> https://someurl.com:443][total保持活动状态:0;分配的路线:1(共1);分配的总数:1/1] 请注意,可以通过在启动时将一些参数传递给JVM来轻松启用HttpClient的日志记录。

那么,为什么不重新使用连接呢?这是由于以下事实:如果现有连接的用户主体与请求的连接不同(由DefaultUserTokenHandler促成),则Apache的HttpClient使用的PoolingHttpClientConnectionManager不允许使用该连接。另请参见此Stackoverflow帖子。解决方案是实现自定义UserTokenHandler(如果足够,则使用NullTokenHandler)并相应地配置HttpClientBuilder。

答案 1 :(得分:0)

您是否已经分析了 HTTP响应标头,以便检查是否考虑了KeepAlive以及具有哪个超时值。

预期响应示例:

HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=10, max=20
Content-Type: text/html; charset=UTF-8
Date: ...
Content-Length: ...