httpclient,“Too many open files”问题总结

项目场景:

线上很老的一个项目要增加一个功能,调用对方接口然后进行数据更新,由于对方接口有时间段要求( PS:对方性能不在考虑范围内),我这边基于commons-httpclient:3.1做的请求。


问题描述

由于对面接口的时间段要求,我这边采用线程池,10个线程,然后使用httpclient调用对方接口,测试环境(Windows Server 2008)测试没问题,但是放到l线上环境(Linux)运行一会就报"Too many open files",代码如下:

HttpClient httpClient = new HttpClient();
GetMethod get= new GetMethod(uri);
try {
	//业务处理
}finally{
	get.releaseConnection();
}

原因分析:

看到错误的第一反应我也是修改ulimit资源限制,如果你也是这样的那很遗憾的告诉你这是不行滴,然后我把处理数量调小,发现还是报错,接着我捋一遍代码,也没发现问题了,明明也releaseConnection了。


解决方案:

从上面看执行releaseConnection()应该释放资源。实际上,HttpClient建立Socket时 ,releaseConnection()并没有真正关闭连接,而是将该连接提交给 MultiThreadedHttpConnectionManager,等待复用。而http的连接是等待timeout才会自动断开的,所以,当用完系统的句柄后,自然会报Too many open files,参考别人的解决方案,代码改为如下:

HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());//使用连接池技术创建

get.addRequestHeader( "Connection", "close");

client.getParams().setBooleanParameter( "http.protocol.expect-continue" , false );

题外话:

  1. Connection:服务器响应后关闭连接
  2. http.protocol.expect-continue:服务器检查请求的标头,客户端必须在其初始请求中作为标头发送
  3. MultiThreadedHttpConnectionManager,我在研究这个类的发现一个工作中不常用的WeakHashMap ,有兴趣的小伙伴自己百度搜下,网上资料很多~

有说的不对的地方,欢迎指出 blush

参考链接:
https://blog.csdn.net/qq_17056391/article/details/123119425
https://dandelioncloud.cn/article/details/1469325844262002689

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值