HttpClient总是无限卡死,紧急

天使小楠 发布于 2015/06/24 11:09
阅读 10K+
收藏 1

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

我们网站大部分功能是通过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();
			}
		}
	}



加载中
0
挨踢Lee
挨踢Lee

曾经也遇到GET多次时卡死解决办法释放IO、关闭response

EntityUtils.consume(entity);
response.close();

天使小楠
天使小楠
这个方法确实可以,非常感谢你O(∩_∩)O
0
牧码氏
牧码氏
用netstat命令看看连接是不是没有释放
0
hibegin
hibegin

你关闭的方式太过粗鲁了。 使用


response.getEntity().getContent().close();


也关下, 看看还有这样的问题。我之前也遇到过这个问题。

天使小楠
天使小楠
回复 @loyal : 问题比较蹊跷,同一个url访问多次后,偶尔才会出现这个卡死状态,所以也有可能是之前访问时遗留的问题,导致最后始终不能运行吧。。。现在就是不知道之前会出现什么问题
loyal
loyal
回复 @天使小楠 : 和关闭有什么关系...然并卵
天使小楠
天使小楠
好的,我尝试一下,非常感谢
0
jobell
jobell

为什么不把closeableHttp  缓存起来??

自己管理一个closeableHttp 的对象池。重复使用应该会好一些。

0
jobell
jobell
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
静风流云
静风流云
Async Http Client
0
凡是定律
凡是定律
出现异常的时候也要abort() 一下,,否则一直会不释放,最后线程太多卡死
天使小楠
天使小楠
abort在final中,出现异常也会执行的哦
0
宇智波带土
宇智波带土
httpClient那个版本的。你dump thread下,看下。
0
唐代de豆腐
唐代de豆腐
是不是你创建连接大多了,试试使用支持连接池的httpclient.
天使小楠
天使小楠
ok,或许就是这个问题,我尝试一下,谢谢你
0
紫海龟
紫海龟

org.apache.http.util.EntityUtils.consume(HttpEntity)

把HttpEntity放在try外面,在finally中判不空,并使用以上方法。

天使小楠
天使小楠
现在是卡在closeableHttp.execute(request);已经到不了HttpEntity entity这里了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部