[英]HTTP connection pooling using HttpClient
我正在 Java 中开发,使用Apache HTTP Client 。
我最近几天都在研究这个,所以只想与您分享一些“人人皆知”的知识。
首先,当您处理同一台服务器时,建议使用单个 HTTP 客户端来执行您的请求。 在PoolingHttpClientConnectionManager
的帮助下,您的客户端可用于同时执行多个请求。 多线程请求执行的官方示例可以在这里找到。
其次,HTTP/1.1(和 HTTP/1.0 的增强版本)允许 HTTP 客户端在事务完成后保持连接打开,以便它可以被重用于未来的请求。 这通常被称为持久连接。
同样为了对多个请求重用客户端,来自服务器的响应头通常包含一个属性调用Keep-Alive
,其中包含当前连接将保持活动的时间。 除此之外,Apache Http Client 还为您提供了一个接口ConnectionKeepAliveStrategy
来自定义您自己的重用连接策略。
PoolingClientConnectionManager
现在已弃用。 从(4.3 版)使用PoolingHttpClientConnectionManager
。
[假设 Java 和 Apache 的 HttpClient]
使用ThreadSafeClientConnManager 。 将单个全局实例传递给每个 HttpClient 实例的构造函数。 我认为将 HttpClient 本身集中起来没有任何意义。
ThreadSafeClientConnManager 现在已弃用,请改用PoolingClientConnectionManager 。
对于 HttpClient 4x:
ThreadSafeClientConnManager ... 管理客户端连接池,并能够为来自多个执行线程的连接请求提供服务。
连接在每个路由的基础上汇集。 对于管理器已经在池中具有可用持久连接的路由的请求,将通过从池中租用连接而不是创建全新的连接来提供服务。
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
这是不需要身份验证的 Apache HttpClient 4.3 连接池的示例:
public class PoolOfHttpConnections{
static String[] urisToGet = {"http://www.site1.com", "http://www.site2.com"};
public static void main(String[] args) throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
// create a thread for each link
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i < threads.length; i++) {
HttpGet httpget = new HttpGet(urisToGet[i]);
threads[i] = new GetThread(httpClient, httpget);
}
// start the threads
for (int j = 0; j < threads.length; j++) {
threads[j].start();
}
// join the threads
for (int j = 0; j < threads.length; j++) {
threads[j].join();
}
} //end main
private static class GetThread extends Thread {
private final CloseableHttpClient httpClient;
private final HttpContext context;
private final HttpGet httpget;
public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
this.httpClient = httpClient;
this.context = HttpClientContext.create();
this.httpget = httpget;
}
@Override
public void run() {
try {
CloseableHttpResponse response = httpClient.execute(httpget, context);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
Date date = new Date();
System.out.println("Beginning*******************");
System.out.println(date.toString());
System.out.println("There are "+urisToGet.length+" threads running in parallel!");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
}
System.out.println(EntityUtils.toString(entity));
EntityUtils.consume(entity);
} finally {
response.close();
System.out.println("End*******************");
}
} catch (ClientProtocolException ex) {
// Handle protocol errors
} catch (IOException ex) {
// Handle I/O errors
}
}
} /*end private class*/ }//end public class PoolOfHttpConnections
HttpClient 已经有一个连接池,所以你不需要创建它。 就用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.