import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
/**
* 基于httpClient3的多线程版本,使用spring管理生命周期
*
*
*/
public class MultiThreadHttpClient3 extends HttpClient implements DisposableBean, InitializingBean {
private static final Logger log = Logger.getLogger(MultiThreadHttpClient3.class);
public static int DEFAULT_TIMEOUT = 1000; // 默认超时1秒
public static int DEFAULT_MAX_CONNECTIONS = 8000;// 默认连8000
public static int DEFAULT_PERHOST_MAX_CONNECTIONS = 2000;// 默认连2000
public static int DEFAULT_READ_TIMEOUT = 1000;
public static int DEFAULT_LOCK_TIMEOUT = 1000; // 默认锁等待1000毫秒
/**
* 连接超时时间
*/
private int timeout = DEFAULT_TIMEOUT;
/**
* 读超时时间
*/
private int readTimeout = DEFAULT_READ_TIMEOUT;
/**
* http池超时时间
*/
private int waitTimeout = DEFAULT_LOCK_TIMEOUT;
/**
* 每个主机的连接数
*/
private int perhostMaxConnection = DEFAULT_PERHOST_MAX_CONNECTIONS;
/**
* 总的连接数
*/
private int totalMaxConnection = DEFAULT_MAX_CONNECTIONS;
/**
* 多线程连接管理
*/
private MultiThreadedHttpConnectionManager connectionManager;
@Override
public void afterPropertiesSet() throws Exception {
if (connectionManager == null) {
connectionManager = new MultiThreadedHttpConnectionManager();
// Protocol https = new Protocol("https",);
log.info("设置最大并发连接数:" + totalMaxConnection);
log.info("设置主机最大并发连接数:" + perhostMaxConnection);
HttpConnectionManagerParams params = connectionManager.getParams();
params.setConnectionTimeout(timeout);
params.setDefaultMaxConnectionsPerHost(perhostMaxConnection);
params.setMaxTotalConnections(totalMaxConnection);
params.setSoTimeout(readTimeout);
this.setHttpConnectionManager(connectionManager);
}
getParams().setConnectionManagerTimeout(waitTimeout);
}
@Override
public void destroy() throws Exception {
if (connectionManager != null) {
connectionManager.shutdown();
connectionManager = null;
}
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getReadTimeout() {
return readTimeout;
}
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
public int getPerhostMaxConnection() {
return perhostMaxConnection;
}
public void setPerhostMaxConnection(int perhostMaxConnection) {
this.perhostMaxConnection = perhostMaxConnection;
}
public int getTotalMaxConnection() {
return totalMaxConnection;
}
public void setTotalMaxConnection(int totalMaxConnection) {
this.totalMaxConnection = totalMaxConnection;
}
public int getWaitTimeout() {
return waitTimeout;
}
public void setWaitTimeout(int waitTimeout) {
this.waitTimeout = waitTimeout;
}
/**
* http post 请求
*/
public String postMethod(String url,String jsonStr){
String responseStr="";
PostMethod post = null;
try{
post = new PostMethod(url);
post.addRequestHeader(new Header("Content-Type","application/json;charset=UTF-8"));
post.setRequestEntity(new StringRequestEntity(jsonStr, "application/json","UTF-8"));
int status = this.executeMethod(post);
log.info("HttpStatus:"+status);
if (status == HttpStatus.SC_OK){
responseStr = new String(post.getResponseBody(),"UTF-8");
log.info(" "+responseStr);
}else{
log.warn("http call failed status:"+status);
}
} catch (Exception e) {
post.abort();
log.error("Exception", e);
} finally {
if (post != null){
post.releaseConnection();
}
}
return responseStr;
}
/**
* http get 请求
* @param url
* @return
* @Description:
*/
public String getMethod(String url){
String responseStr="";
GetMethod get = null;
try {
get = new GetMethod(url);
get.addRequestHeader(new Header("Content-Type","application/json;charset=UTF-8"));
int status = this.executeMethod(get);
log.info("HttpStatus:"+status);
if (status == HttpStatus.SC_OK){
responseStr = new String(get.getResponseBody(),"UTF-8");
log.info("responseStr: "+responseStr);
}else{
log.warn("http call failed status:"+status);
}
} catch (Exception e) {
get.abort();
log.error("Exception", e);
}finally{
if (get != null){
get.releaseConnection();
}
}
return responseStr;
}
public static void main(String[] args) throws Exception {
final MultiThreadHttpClient3 client3 = new MultiThreadHttpClient3();
client3.afterPropertiesSet();
//10组,每组20个线程请求百度,测试性能
int size = 20;
//无限量线程池
ExecutorService es=Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
Long start=System.currentTimeMillis();
//线程计数器
final CountDownLatch latch = new CountDownLatch(size);
for (int y = 0; y < size; y++) {
es.execute(new Runnable() {
@Override
public void run() {
//使用例子
client3.getMethod("http://www.baidu.com");
latch.countDown();
}
});
}
latch.await();
System.out.println("执行完毕! 耗时(毫秒):"+(System.currentTimeMillis()-start));
}
es.shutdown();
}
}
基于httpClient3的多线程版本,使用spring管理生命周期
基于Spring管理的多线程HTTP客户端
最新推荐文章于 2024-08-08 05:12:15 发布
173万+

被折叠的 条评论
为什么被折叠?



