基于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
原创粉丝点击