您的位置:首页 > 理论基础 > 计算机网络

httpclient 3.x 中 MultiThreadedHttpConnectionManager参数理解

2018-01-24 18:31 417 查看


前两天做项目时,用了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,所以实际只有两个线程可以访问,另外三个线程必须等待着两个线程处理完毕后才会发送请求.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: