之前采用Httpclient4.3写了一个抓取服务,突然有一天线上出现了很多这样的报警
Read time out 和 ConnectionPoolTimeoutException: Timeout waiting for connection
使用连接池的原因是:没有连接池的话,多少次请求就会建立多少个IO,在访问量巨大的情况下服务器的IO可能会耗尽。
1 检查连接是否关闭
EntityUtils.consume(response.getEntity());
经检查所有的地方都采用这种方式在请求完进行关闭了。
以上关闭的原理是取出response的文件流InputStream(in),再执行in.close()关闭。
2 遇到异常时,关闭请求
已确认都关闭,但是线上的报警仍然存在。于是在遇到异常时显示调用HttpUriRequest的abort,这样就会直接中止这次连接,我们在遇到异常的时候应该显示调用,因为谁能保证异常是在InputStream in赋值之后才抛出的呢。