3.X
http://hc.apache.org/httpclient-3.x/performance.html
public class MultiThreadedExample {
/**
* Constructor for MultiThreadedExample.
*/
public MultiThreadedExample() {
super();
}
public static void main(String[] args) {
// Create an HttpClient with the MultiThreadedHttpConnectionManager.
// This connection manager must be used if more than one thread will
// be using the HttpClient.
HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
// Set the default host/protocol for the methods to connect to.
// This value will only be used if the methods are not given an absolute URI
httpClient.getHostConfiguration().setHost("hc.apache.org", 80, "http");
// create an array of URIs to perform GETs on
String[] urisToGet = {
"/",
"/httpclient-3.x/status.html",
"/httpclient-3.x/methods/",
"http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/"
};
// create a thread for each URI
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i < threads.length; i++) {
GetMethod get = new GetMethod(urisToGet[i]);
get.setFollowRedirects(true);
threads[i] = new GetThread(httpClient, get, i + 1);
}
// start the threads
for (int j = 0; j < threads.length; j++) {
threads[j].start();
}
}
/**
* A thread that performs a GET.
*/
static class GetThread extends Thread {
private HttpClient httpClient;
private GetMethod method;
private int id;
public GetThread(HttpClient httpClient, GetMethod method, int id) {
this.httpClient = httpClient;
this.method = method;
this.id = id;
}
/**
* Executes the GetMethod and prints some satus information.
*/
public void run() {
try {
System.out.println(id + " - about to get something from " + method.getURI());
// execute the method
httpClient.executeMethod(method);
System.out.println(id + " - get executed");
// get the response body as an array of bytes
byte[] bytes = method.getResponseBody();
System.out.println(id + " - " + bytes.length + " bytes read");
} catch (Exception e) {
System.out.println(id + " - error: " + e);
} finally {
// always release the connection after we're done
method.releaseConnection();
System.out.println(id + " - connection released");
}
}
}
}
4.X
http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/connmgmt.html
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
// URIs to perform GETs on
String[] urisToGet = {
"http://www.domain1.com/",
"http://www.domain2.com/",
"http://www.domain3.com/",
"http://www.domain4.com/"
};
// create a thread for each URI
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();
}
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.*;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Created by
* on 16/10/11.
* Description: 测试pool会自动管理connection
*/
public class Test {
// 长连接保持30秒
static PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
public static CloseableHttpClient buildHttpClient() {
// 总连接数
pollingConnectionManager.setMaxTotal(2);
// 同路由的并发数
pollingConnectionManager.setDefaultMaxPerRoute(500);
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setConnectionManager(pollingConnectionManager);
// 重试次数,默认是3次,没有开启
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true));
// 保持长连接配置,需要在头添加Keep-Alive
httpClientBuilder.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE);
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));
headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));
headers.add(new BasicHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"));
headers.add(new BasicHeader("Connection", "keep-alive"));
httpClientBuilder.setDefaultHeaders(headers);
return httpClientBuilder.build();
}
public static void main(String args[]) throws IOException, InterruptedException {
CloseableHttpClient closeableHttpClient = buildHttpClient();
HttpPost post = new HttpPost("");
StringEntity se = new StringEntity("");
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 10; i > 0; i--) {
new Thread(() -> {
try {
String result = closeableHttpClient.execute(post, new ResponseHandler<String>() {
@Override
public String handleResponse(HttpResponse response) throws IOException {
int status = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
if (status >= 200 && status < 300) {
return EntityUtils.toString(entity);
}
System.out.println(status);
return null;
}
});
System.out.println(result);
countDownLatch.countDown();
} catch (IOException e) {
e.printStackTrace();
countDownLatch.countDown();
}
}).start();
}
countDownLatch.await();
System.in.read();
}
}