基于httpClient3的多线程版本,使用spring管理生命周期
来源:互联网 发布:交易平台软件使用协议 编辑:程序博客网 时间:2024/06/06 08:31
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(); }}
0 0
- 基于httpClient3的多线程版本,使用spring管理生命周期
- httpclient3.1的多线程处理
- Spring 生命周期管理的缺陷
- Spring 管理bean的生命周期
- spring Bean的生命周期管理
- Spring管理Bean的生命周期
- httpclient3.x中使用HTTPS的方法
- Spring管理的Bean的生命周期
- Spring管理的Bean的生命周期
- Spring BeanFactory管理Bean的生命周期
- Spring Bean的生命周期管理方法
- spring容器与管理bean的生命周期
- Spring学习历程---管理bean的生命周期
- 如何使用HttpClient3.x
- httpclient3.1简单使用
- java之httpclient3.0版本
- spring管理bean生命周期
- Spring bean 生命周期管理
- Notepad++直接编译运行Java
- 浅谈程序的性格
- 点分治 nbut1654 Ancient battle tree
- 不抛出异常的swap
- Unable to create Debug Bridge:Unable to start adb server
- 基于httpClient3的多线程版本,使用spring管理生命周期
- 不允许使用邮箱名称。 服务器响应为:authentication is required
- iOS 【UIKit-转换坐标系(2)】
- Java回调机制
- 使用 Intel HAXM 为 Android 模拟器加速
- HDOJ 1087 Super Jumping! Jumping! Jumping! (dp)
- 华为机试题: 求n!中含有0的个数(JAVA)
- servlet四大域总结
- windows创建添加系统变量