开发者社区> 问答> 正文

HttpClient总是无限卡死,紧急?报错

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



展开
收起
爱吃鱼的程序员 2020-06-14 15:13:16 2373 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

    这个方法确实可以,非常感谢你O(∩_∩)O 用netstat命令看看连接是不是没有释放

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


    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这里了
    2020-06-14 15:13:34
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载