httpclient 3.x 中 MultiThreadedHttpConnectionManager参数理解





前两天做项目时,用了httpclient MultiThreadedHttpConnectionManager,其中有两个参数 setDefaultMaxConnectionsPerHost,setMaxTotalConnections,刚开始对着两个参数的理解模模糊糊,后来经过代码测试,才终于彻底明白了,接下来我就贴上一些代码来加以说明

public class HttpClient {
     MultiThreadedHttpConnectionManager manager=null;
     public HttpClient(){
        
          manager=new MultiThreadedHttpConnectionManager();//构建全局唯一的线程池
    }
     public String getPostResponse(String url,String encode,String requestBody){
         org.apache.commons.httpclient.HttpClient client=new org.apache.commons.httpclient.HttpClient(manager);
         setParam(manager);
         PostMethod post=new PostMethod(url);
         setPostParam(post,requestBody);
         String result=null;
         StringBuffer sb=new StringBuffer();
         BufferedReader in=null;
         try {
             client.executeMethod(post);
             in=new BufferedReader(new InputStreamReader(post.getResponseBodyAsStream(), post.getRequestCharSet()));
             String inputLine = null;
             while ((inputLine = in.readLine()) != null)
             {
                 sb.append(inputLine);
                 sb.append("\n");
             }
             result = ConverterStringCode(sb.toString() , post.getResponseCharSet(), encode);
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }finally{
             post.releaseConnection();
             if(in !=null){
                 try {
                     in.close();
                 } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                     in=null;
                 }
             }
            
         }
        
         return result;
        
     }
     private static void setParam(MultiThreadedHttpConnectionManager manager){
         manager.getParams().setConnectionTimeout(5000);
         manager.getParams().setSoTimeout(20000);//read time out
         manager.getParams().setDefaultMaxConnectionsPerHost(32);
         manager.getParams().setMaxTotalConnections(128);
        
     }
     private static String ConverterStringCode(String source, String srcEncode,String destEncode)
     {
         if (source != null)
         {
             try
             {
                 return new String(source.getBytes(srcEncode), destEncode);
             }
             catch (UnsupportedEncodingException e)
             {
                 e.printStackTrace();
                 return "";
             }
         } else {return "";}
     }
     private static void setPostParam(PostMethod post,String requestBody){
            post.getParams().setParameter(HttpMethodParams.HTTP_ELEMENT_CHARSET, "utf-8");
            post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8");
            try {
             ByteArrayRequestEntity entity=new ByteArrayRequestEntity(requestBody.getBytes("utf-8"));
             post.setRequestEntity(entity);
             post.setFollowRedirects(false);
             post.setRequestHeader("Content-Length", String.valueOf(entity.getContentLength()));
         } catch (UnsupportedEncodingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
           
     }
 }

其中getPostResponse方法是本次测试的重点.

如果setDefaultMaxConnectionsPerHost设置为默认值(2),代表着每台主机最多可以有两个httpconnection,但是如果实际项目中需要并发的同时访问某一服务器a,例如有5个线程同时在不断的给服务器a发送请求,但是由于setDefaultMaxConnectionsPerHost设置的最大数为2,所以实际只有两个线程可以访问,另外三个线程必须等待着两个线程处理完毕后才会发送请求.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值