对于HttpClient4.x来说,使用完后的HttpClient对象,需要显式地释放其使用的底层HTTP连接,否则将造成过高的资源占用。前一篇文章《HttpClient4.x进行Get/Post请求并使用ResponseHandler处理响应》演示了如何使用ResponseHandler处理GET/POST请求的响应结果并自动释放底层HTTP连接,如下这个例子演示了如何确保在手动处理HTTP响应的情况下释放底层的HTTP连接回连接管理器。
package cn.ysh.studio.crawler.httpclient;import java.io.IOException;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;/** * 这个例子演示了如何以推荐的方式使用API,以确保底层HTTP连接被释放回连接管理器 * * @author Shenghany * @date 2013-5-19 */publicclassClientConnectionRelease{publicfinalstaticvoid main(String[] args)throwsException{HttpClient httpclient =newDefaultHttpClient();try{HttpGet httpget =newHttpGet("http://www.yshjava.cn");System.out.println("executing request "+ httpget.getURI());// 执行HTTP请求HttpResponse response = httpclient.execute(httpget);System.out.println("----------------------------------------");System.out.println(response.getStatusLine());System.out.println("----------------------------------------");// 得到响应的实体HttpEntity entity = response.getEntity();// 如果响应不包含实体,那么就不必关心连接的释放if(entity !=null){InputStream instream = entity.getContent();try{ instream.read();// 这里可以对输入流进行一些期望的操作//...}catch(IOException ex){// 如果在处理过程中遇到IOExcetption异常,那么连接将被自动释放回连接管理器throw ex;}catch(RuntimeException ex){// 当发生意料之外的异常时,你或许希望通过终止http请求以立即关闭底层连接 httpget.abort();throw ex;}finally{// 关闭输入流时将触发自动释放连接回连接管理器try{ instream.close();}catch(Exception ignore){}}}}finally{// 当不再需要HttpClient实例时,关闭连接管理器以确保释放所有占用的系统资源 httpclient.getConnectionManager().shutdown();}}}