博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
httpclient 4.3.3 Timeout waiting for connection
阅读量:6513 次
发布时间:2019-06-24

本文共 1691 字,大约阅读时间需要 5 分钟。

hot3.png

前几天写一个小脚本,爬几个页面,自己写着玩的,但是中间出现一些情况,做下备忘

在我已经设置了SocketTimeout 和 ConnectTimeout 还会出现请求一个地址的时候就卡死在那里的情况,也不知道什么原因,也没有报错,就那么卡着了

后来我跟到了httpclient的源码里这个类MainClientExec 的 方法 

public CloseableHttpResponse execute(            final HttpRoute route,            final HttpRequestWrapper request,            final HttpClientContext context,            final HttpExecutionAware execAware) throws IOException, HttpException
try {            final int timeout = config.getConnectionRequestTimeout();            managedConn = connRequest.get(timeout > 0 ? timeout : 0, TimeUnit.MILLISECONDS);        } catch(final InterruptedException interrupted) {            Thread.currentThread().interrupt();            throw new RequestAbortedException("Request aborted", interrupted);        } catch(final ExecutionException ex) {            Throwable cause = ex.getCause();            if (cause == null) {                cause = ex;            }            throw new RequestAbortedException("Request execution failed", cause);        }

这里获取了一个timeout 

config.getConnectionRequestTimeout()

然后在RequestConfig里增加上了这个配置,以为就完事了,结果倒是不卡在某一个地址了,直接报错

Timeout waiting for connection

这个错误上网找了找,百度谷歌都试了,大概的意思是开了很多求情但是没有正常关闭

  1. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  

发现CLOSE_WAIT的数量始终在400以上,一直没降过。

我又看了下自己的代码,没有出现获取inputstream没有关闭的情况的啊,因为我创建文件也好,获取网页源码也好,都是使用的EntityUtils提供的方法,这个工具类都会在finally里关闭inputstream

再次检查代码,主要查找没有关闭 CloseableHttpResponse 的地方加上response.close()终于发现问题。

我在一个地方使用了CloseableHttpResponse response = httpClient.execute(post);

但是在下面我有一个if判断,我把response的close放在了判断里,而没有进入判定为真的请求,response 就无法关闭了,导致了连接池被占满无法释放

知道了问题解决就轻松加愉快了,也告诫了我,以后response 一定要关闭

转载于:https://my.oschina.net/u/943305/blog/487953

你可能感兴趣的文章
Money去哪了- 每日站立会议
查看>>
Python数据结构和算法学习笔记1
查看>>
正则之从dom字符串中提取url
查看>>
大数据——基础概念
查看>>
第六次上机实验
查看>>
机器学习温和指南
查看>>
解决Geoserver请求跨域的几种思路,第二种思路用过
查看>>
最短路-Bellman-Ford算法
查看>>
Object 类有哪些方法
查看>>
oracle 将一个表复制到另外一个表里 .
查看>>
libcurl以get方式请求服务器端文件
查看>>
OpenJudge 2786 Pell数列
查看>>
mysql 游标循环,嵌套游标循环
查看>>
win7 蛋疼的时间格式转化
查看>>
C++中二维数组的动态创建与处理
查看>>
SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
查看>>
SpringInAction--Bean参数的自动注入
查看>>
素数筛
查看>>
centos /linux 修改目录或文件权限
查看>>
leetcode--
查看>>