我们网站大部分功能是通过HttpClient获取其他接口提供的内容,但每隔一两天就会出现访问卡死,设置了超时时间,也无限卡死,经断点查看,是卡在closeableHttp.execute(request);开始执行这行代码后就卡死了,不报错,也不执行结束。
以下是完整代码,已查阅过相关doc,实在解决不了了,大家帮忙看下是哪里写的不对?非常感谢
public String getContent(String url, int timeOut) { HttpClientBuilder httpBuilder = HttpClientBuilder.create(); if (timeOut > 0) { RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut).setConnectTimeout(timeOut).setSocketTimeout(timeOut).build(); httpBuilder.setDefaultRequestConfig(requestConfig); } CloseableHttpClient closeableHttp = httpBuilder.build(); HttpGet request = new HttpGet(url); CloseableHttpResponse response = null; try { response = closeableHttp.execute(request); HttpEntity entity = response.getEntity(); return entity == null ? null : EntityUtils.toString(entity, CharacterSet.UTF8); } catch (Exception e) { e.printStackTrace(); return null; } finally { try { if (request != null) { request.abort(); } if (response != null) { response.close(); } closeableHttp.close(); } catch (IOException e) { e.printStackTrace(); } } }
曾经也遇到GET多次时卡死解决办法释放IO、关闭response
EntityUtils.consume(entity);
response.close();
你关闭的方式太过粗鲁了。使用
response.getEntity().getContent().close() ;
也关下,看看还有这样的问题。我之前也遇到过这个问题。
回复 @loyal:问题比较蹊跷,同一个url访问多次后,偶尔才会出现这个卡死状态,所以也有可能是之前访问时遗留的问题,导致最后始终不能运行吧。。。现在就是不知道之前会出现什么问题回复 @天使小楠:和关闭有什么关系...然并卵好的,我尝试一下,非常感谢为什么不把closeableHttp 缓存起来??
自己管理一个closeableHttp的对象池。重复使用应该会好一些。
http://curl.haxx.se/libcurl/java/ AsyncHttpClient出现异常的时候也要abort()一下,,否则一直会不释放,最后线程太多卡死abort在final中,出现异常也会执行的哦httpClient那个版本的。你dumpthread下,看下。是不是你创建连接大多了,试试使用支持连接池的httpclient.ok,或许就是这个问题,我尝试一下,谢谢你org.apache.http.util.EntityUtils.consume(HttpEntity)
把HttpEntity放在try外面,在finally中判不空,并使用以上方法。
现在是卡在closeableHttp.execute(request);已经到不了HttpEntityentity这里了版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。