1、HttpClient4.x手动释放底层HTTP连接
如非注明,本站文章均为原创,转载请注明出处。
本文地址:
对于HttpClient4.x来说,使用完后的HttpClient对象,需要显式地释放其使用的底层HTTP连接,否则将造成过高的资源占用。前一篇文章《HttpClient4.x进行Get/Post请求并使用ResponseHandler处理响应》演示了如何使用ResponseHandler处理GET/POST请求的响应结果并自动释放底层HTTP连接,如下这个例子演示了如何确保在手动处理HTTP响应的情况下释放底层的HTTP连接回连接管理器。
package cn.ysh.s
2、tudio.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.DefaultHttp
3、Client;
/**
* 这个例子演示了如何以推荐的方式使用API,以确保底层HTTP连接被释放回连接管理器
*
* @author Shenghany
* @date 2013-5-19
*/
public class ClientConnectionRelease {
public final static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
try {
4、 HttpGet httpget = new HttpGet("");
System.out.println("executing request " + httpget.getURI());
// 执行HTTP请求
HttpResponse response = httpclient.execute(httpget);
System.out.println("----------------------------------------");
5、 System.out.println(response.getStatusLine());
System.out.println("----------------------------------------");
// 得到响应的实体
HttpEntity entity = response.getEntity();
// 如果响应不包含实体,那么就不必关心连接的释放
if (entity != null) {
In
6、putStream instream = entity.getContent();
try {
instream.read();
// 这里可以对输入流进行一些期望的操作
//...
} catch (IOException ex) {
// 如果在处理过程中遇到IOExcetption异常,那么连接将被自动释放回连接管理器
throw ex;
7、 } catch (RuntimeException ex) {
// 当发生意料之外的异常时,你或许希望通过终止http请求以立即关闭底层连接
httpget.abort();
throw ex;
} finally {
// 关闭输入流时将触发自动释放连接回连接管理器
try { instream.close(); } catch (Exception ignore) {}
}
}
} finally {
// 当不再需要HttpClient实例时,关闭连接管理器以确保释放所有占用的系统资源
httpclient.getConnectionManager().shutdown();
}
}
}