HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接
来源:互联网 发布:欧美时尚杂志 知乎 编辑:程序博客网 时间:2024/06/08 13:17
在上一篇文章Resin服务器出现大量的ESTABLISHED和TIME_WAIT连接造成响应缓慢中提到网络的三种状态:
ESTABLISHED 表示正在进行网络连接的数量
TIME_WAIT 表示表示等待系统主动关闭网络连接的数量
CLOSE_WAIT 表示被动等待程序关闭的网络连接数量
上篇文章给出了解决TIME_WAIT太多的方法,本篇文章以HttpClient为例说明解决大量CLOSE_WAIT状态的方法。
HttpClient是大量使用的用于HTTP连接的包,首先需要说明的是HttpClient 3.x和4.x之间API差距很多,不过强烈建议使用4.x的版本。除此之外,4.x中每个x之间也有一些差别(比如一些弃用的类,新增加的类等),这里以4.2.3版本进行说明。
HttpClient使用的HTTP 1.1协议进行连接,相对于HTTP 1.0来说有一个持续连接的增强,为了充分利用持续连接的特性,在一次连接结束之后,即使将HttpResponse使用close方法关闭,并且将调用了HttpGet或HttpPost的releaseConnection方法,示例代码如下:
HttpGet method = null; HttpResponse response = null; try { method = new HttpGet(url); response = client.execute(method); } catch(Exception e) { } finally { if(response != null) { EntityUtils.consumeQuietly(response.getEntity()); } if(method != null) { method.releaseConnection(); } }
这个时候仍然发现连接处于CLOSE_WAIT状态,这是因为HttpClient在执行close的时候,如果发现Response的Header中Connection是Keep-alive则连接不会关闭,以便下次请求相同网站的时候进行复用,这是产生CLOSE_WAIT连接的原因所在。
最简单的一种解决方法在execute方法之前增加Connection: close头信息,HTTP协议关于这个属性的定义如下:
HTTP/1.1 defines the "close" connection option for the sender to signal that the connection will be closed after completion of the response. For example: Connection: close
示例代码如下:
HttpGet method = null;HttpResponse response = null;try { method = new HttpGet(url); method.setHeader(HttpHeaders.CONNECTION, "close"); response = client.execute(method);} catch(Exception e) {} finally { if(response != null) { EntityUtils.consumeQuietly(response.getEntity()); } if(method != null) { method.releaseConnection(); }}
当然,也可以每次请求之后关闭client,但这一点不符合HttpClient设计的原则——复用。如果每次连接完成之后就关闭连接,效率太低了。因此,需要使用PoolingClientConnectionManager,并且设置maxTotal(整个连接池里面最大连接数,默认为20)和defaultMaxPerRoute(每个主机的最大连接数,默认为2),另外client还有一个ClientPNames.CONN_MANAGER_TIMEOUT参数,用来设置当连接不够获取新连接等待的超时时间,默认和CoreConnectionPNames.CONNECTION_TIMEOUT相同。可以根据实际情况对PoolingClientConnectionManager进行设置,以达到效率最优。
还有一种情况也会造成大量CLOSE_WAIT连接,即HttpResponse的状态码不是200的时候,需要及时调用method.abort()方法对连接进行释放,详细可以参考这篇文章。
- HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接
- HttpClient容易忽视的细节——连接关闭,使用不当服务器会出现大量的Close_Wait现象
- 解决服务器出现大量CLOSE_WAIT和TIME_WAIT连接的方法
- linux服务器出现大量CLOSE_WAIT状态的连接
- linux服务器出现大量CLOSE_WAIT状态的连接
- tcp连接大量CLOSE_WAIT
- Linux网络tcp连接大量CLOSE_WAIT和TIME_WAIT状态的出现和解决方法
- 当出现大量timewait状态的连接时,该如何处理?
- 20170208大量Http请求close_wait的问题
- 20170208大量Http请求close_wait的问题
- easydarwin大量出现close_wait
- Socket连接出现大量的FIN_WAIT_2状态
- Socket连接出现大量的FIN_WAIT_2状态
- httpclient http连接池
- http连接之HttpClient
- [经验随笔]大量close_wait状态连接问题的分析与解决
- 当vs2015 创建ADO实体生成模型的时候出现的连接异常
- Http请求连接池 - HttpClient 的 PoolingHttpClientConnectionManager
- C++之最长前缀字符串(13)---《那些奇怪的算法》
- CMD批处理命令收集
- 安卓开发定时刷新界面
- Unity3D protobuf-net使用方式 (源码方式)
- PKU Helper 招新面试三
- HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接
- POJ
- ubuntu 14.04 下 安装samba 及SSH 服务端的方法
- AndroidStudio 修改LogCat的颜色
- 重入锁ReentranLock与Synchronized对比
- 第2章 线程与锁-2.3 超越内置锁
- java学习:substring函数用法
- ios-Alamofire的简单使用
- 将数组A中的内容和数组B中的内容进行交换。(数组一样大)