Apache的HttpClient的连接配置

问题描述 投票:1回答:2

我试图建立通过HttpClient一个HttpClientBuilder。我也有看HttpClientConnectionManager和这里的混乱开始。

在的ConnectionManager或更准确的PoolingHttpClientConnectionManager有以下方法:

  • 接近过期的连接
  • 关闭空闲连接

当连接视为过期? 当怠速运转? 当从池中的连接被关闭,会发生什么?是否保证,有需要时重新连接?

java connection-pooling apache-httpclient-4.x
2个回答
1
投票

据:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

HttpClient的尝试通过检测该连接是否是“过时”,以减轻该问题,因为它被关闭在服务器端,使用用于执行一个HTTP请求的连接之前即不再有效。陈旧的连接检查是不是100%可靠。不涉及每个插槽模型一个线程空闲连接的唯一可行的解​​决方案是用于驱逐被视为过期的连接的专用监视器线程由于不活动的长的时间。监视器线程可以定期调用ClientConnectionManager#closeExpiredConnections()方法来从池中关闭所有过期的连接和驱逐关闭的连接。它也可以选择拨打ClientConnectionManager#closeIdleConnections()方法来关闭已闲置超过给定时间内的所有连接。

过期和空闲之间的差别在于一个过期的连接已经关闭在服务器端,而在空闲连接不必在服务器端关闭,但它已经过了一段时间空闲。当连接关闭时,它才会再次可用在池中使用。


1
投票

HTTP是基于TCP,它管理的是包以正确的顺序发送和接收,并请求重传包,如果走丢了中期的方式。一个TCP连接开始用由SYNSYN-ACKACK消息的同时将其与FINACK-FINACK系列如可从从Wikipedia enter image description here采取了这种图像可以看出结束的TCP握手

而HTTP是一种请求 - 响应协议,打开和关闭连接是相当昂贵的,因此HTTP / 1.1允许再利用现有的连接。随着头Connection: keep-alive即你告诉你的客户端(即浏览器),以保持开放到服务器的连接。一台服务器可以有litterally成千上万在同一时间打开的连接。为了避免耗尽服务器的资源连接通常是及时的限制。通过套接字超时空闲连接或连接某些连接问题(打破互联网接入,...)是一些预先设定的时间后,由服务器自动关闭。

HTTP实现,如阿帕奇HTTP客户端4.4及以后的大量,检查连接的状态,只有当它是关于使用它。

失效连接的处理在4.4版本被改变。此前,该代码会检查再次使用前,默认为每连接。代码如果自上次使用连接的时间超过已设置超时现在只检查连接。默认的超时时间设置为2000毫秒(Source

因此,如果可能没有被使用了一段时间的连接,客户端可能无法从服务器读取ACK-FIN,因此仍然认为该连接是打开的时候,它实际上已经得到了由服务器前一段时间封闭。这种连接过期,通常被称为半封闭。因此它可以在泳池边收集。

请注意,如果你发送请求包括Connection: close HTTP头,连接后应正确客户端收到的响应关闭。

打开连接的状态可以通过netstat这应该是存在于大多数现代操作系统进行检查。最近,我不得不检查并经由第三方库,没有传播Connection: Close头正常,因此导致了大量的半封闭的连接管理我们的HTTP客户之一。

© www.soinside.com 2019 - 2024. All rights reserved.