zoukankan      html  css  js  c++  java
  • HttpClient 大量连接等待异常的处理

    前几天要扫一批连接,因为涉及到ua的适配测试,所以选用了httpclient处理。

    httpclient其实很好用,也用过几次,还曾经写过自动刷人人网人气的程序,不过对于它掌握还是处在比较浅显的时代

    我这人比较懒,学习动力还是太弱,不逼到份上都懒得学习哎!

    这次又用到这东西了就直接看了看api 就开始写了,不过写的时候发现一个问题。

    开始跑100多个url的时候是没问题的,不过过了一定量数后,会大量的抛出如下异常

    org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection
    at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417)
    at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300)
    at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at com.ua.engine.Engine.httpService(Engine.java:97)
    at com.ua.engine.Engine.main(Engine.java:27)

    对此很不解,还是了解的不够多啊,后来发现问题了,原来之前一直使用连接池中的一条连接进行链接访问,用的多了,连接到期,会造成连接等待的情况,

    因为使用的HttpClient4 ,于是查了下资料,发现使用完每个连接后一定要及时的释放掉,不然上面的错会无限的报下去。

    而释放连接只用InputStream 就能轻松搞定了

    最后整体的代码如下

      1 package com.ua.engine;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.BufferedWriter;
      5 import java.io.FileReader;
      6 import java.io.IOException;
      7 import java.io.InputStream;
      8 import java.io.PrintWriter;
      9 import java.util.ArrayList;
     10 import java.util.HashMap;
     11 import java.util.List;
     12 
     13 import org.apache.http.HttpEntity;
     14 import org.apache.http.HttpResponse;
     15 import org.apache.http.client.HttpClient;
     16 import org.apache.http.client.methods.HttpGet;
     17 
     18 
     19 public class Engine {
     20     
     21     public static void main(String[] args) {
     22         try {
     23             HashMap<String,List<String>> map = readURL();
     24             BufferedWriter bw = new BufferedWriter(new PrintWriter("D://furl/log.txt"));
     25                 List<String> weblist = map.get("web");
     26                 int i = 1;
     27                 for(String url :weblist){
     28                     System.out.println(i);
     29                     String temp = Engine.httpService("http://52.easou.com"+url,"web")+" "+url;
     30                     System.out.println(temp);
     31                     bw.write(temp);
     32                     bw.write("\r\n");
     33                     i++;
     34                 }
     35                 List<String> touchlist = map.get("touch");
     36                 for(String url :touchlist){
     37                     System.out.println(i);
     38                     String temp = Engine.httpService("http://52.easou.com"+url,"touch")+" "+url;
     39                     System.out.println(temp);
     40                     bw.write(temp);
     41                     bw.write("\r\n");
     42                     i++;
     43                 }
     44                 List<String> hdlist = map.get("hd");
     45                 for(String url :hdlist){
     46                     System.out.println(i);
     47                     String temp = Engine.httpService("http://52.easou.com"+url,"hd")+" "+url;
     48                     System.out.println(temp);
     49                     bw.write(temp);
     50                     bw.write("\r\n");
     51                     i++;
     52                 }
     53                 List<String> cslist = map.get("cs");
     54                 for(String url :cslist){
     55                     System.out.println(i);
     56                     String temp = Engine.httpService("http://52.easou.com"+url,"cs")+" "+url;
     57                     System.out.println(temp);
     58                     bw.write(temp);
     59                     bw.write("\r\n");
     60                     i++;
     61                 }
     62                 bw.flush();
     63                 bw.close();
     64         }
     65         catch (Exception e) {
     66             e.printStackTrace();
     67         }
     68     }
     69     private static HttpClient httpclient = null;
     70     static {
     71         HttpClientUtils hcu = new HttpClientUtils();
     72         hcu.setConnTimeout(10000);
     73         hcu.setSoTimeout(10000);
     74         hcu.setBufSize(128 * 1024);
     75         hcu.setAgent("");
     76         hcu.setMaxRedirect(3);
     77         hcu.setMaxTotal(500);
     78         hcu.setMaxPerRoute(100);
     79         httpclient = hcu.newClient();
     80     }
     81     public static String httpService(String url,String version) {
     82         HttpGet get = new HttpGet(url);
     83         if("web".equals(version)){
     84             get.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5");
     85         }else if("touch".equals(version)){
     86             get.setHeader("User-Agent", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16");
     87         }else if("hd".equals(version)){
     88             get.setHeader("User-Agent", "Mozilla/5.0 (iPad; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16");
     89         }else {
     90             get.setHeader("User-Agent", "lg-kp500 teleca/wap2.0 midp-2.0/cldc-1.1 untrusted/1.0 nokia7610 (3.0417.0ch) symbianos/7.0s series60/2.1 profile/midp-2.0 conf");
     91         }
     92 
     93 //        HttpEntity entity = response.getEntity();
     94 //        System.out.println(EntityUtils.toString(entity));
     95         HttpResponse response = null;
     96         String code = "error "+url;
     97         InputStream in = null;  
     98         try {
     99             response = httpclient.execute(get);
    100             HttpEntity entity =response.getEntity();  
    101             if( entity != null ){   
    102              in = entity.getContent(); //之前没使用这个造成了大量异常抛出,只要是
    103             }
    104             code = response.getStatusLine().getStatusCode()+" "+version+" "+url;
    105             return code;
    106         }
    107         catch (Exception e) {
    108             System.out.println(code);
    109             e.printStackTrace();
    110         }finally {
    111             if(in!=null){
    112                 try {
    113                     in.close();
    114                 }
    115                 catch (IOException e) {
    116                     e.printStackTrace();
    117                 }
    118             }
    119         }
    120         return code;
    121     }
    122     
    123     public static HashMap<String,List<String>> readURL() throws Exception{
    124         List<String> weblist = new ArrayList<String>();
    125         List<String> touchlist = new ArrayList<String>();
    126         List<String> hdlist = new ArrayList<String>();
    127         List<String> cslist = new ArrayList<String>();
    128         
    129         BufferedReader br = new BufferedReader(new FileReader("D://furl/1.txt"));
    130         while(br.ready()){
    131             String url = br.readLine();
    132             if(url.toLowerCase().indexOf(".html")>-1){
    133                 weblist.add(url);
    134             }else if(url.toLowerCase().indexOf("touch")>-1){
    135                 touchlist.add(url);
    136             }else if(url.toLowerCase().indexOf("/hd/")>-1){
    137                 hdlist.add(url);
    138             }else {
    139                 cslist.add(url);
    140             }
    141         }
    142         br = new BufferedReader(new FileReader("D://furl/url1.txt"));
    143         while(br.ready()){
    144             String url = br.readLine();
    145             if(url.toLowerCase().indexOf(".html")>-1){
    146                 weblist.add(url);
    147             }else if(url.toLowerCase().indexOf("touch")>-1){
    148                 touchlist.add(url);
    149             }else if(url.toLowerCase().indexOf("/hd/")>-1){
    150                 hdlist.add(url);
    151             }else {
    152                 cslist.add(url);
    153             }
    154         }
    155         br = new BufferedReader(new FileReader("D://furl/urljian1.txt"));
    156         while(br.ready()){
    157             String url = br.readLine();
    158             if(url.toLowerCase().indexOf(".html")>-1){
    159                 weblist.add(url);
    160             }else if(url.toLowerCase().indexOf("touch")>-1){
    161                 touchlist.add(url);
    162             }else if(url.toLowerCase().indexOf("/hd/")>-1){
    163                 hdlist.add(url);
    164             }else {
    165                 cslist.add(url);
    166             }
    167         }
    168         HashMap<String,List<String>> map = new HashMap<String,List<String>>();
    169         System.out.println(weblist.size());
    170         System.out.println(touchlist.size());
    171         System.out.println(hdlist.size());
    172         System.out.println(cslist.size());
    173         map.put("web", weblist);
    174         map.put("touch", touchlist);
    175         map.put("hd", hdlist);
    176         map.put("cs", cslist);
    177         return map;
    178     }
    179 }
     1 package com.ua.engine;
     2 
     3 import org.apache.http.HttpVersion;
     4 import org.apache.http.client.HttpClient;
     5 import org.apache.http.client.params.ClientPNames;
     6 import org.apache.http.impl.client.DefaultHttpClient;
     7 import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
     8 import org.apache.http.params.BasicHttpParams;
     9 import org.apache.http.params.CoreConnectionPNames;
    10 import org.apache.http.params.CoreProtocolPNames;
    11 import org.apache.http.params.HttpParams;
    12 
    13 public class HttpClientUtils {
    14     private int connTimeout = 5000;
    15     private int soTimeout = 5000;
    16     private int bufSize = 128 * 1024;
    17     private String agent = "";
    18     private int maxRedirect = 3;
    19     private int maxTotal = 500;
    20     private int maxPerRoute = 100;
    21 
    22     public HttpClient newClient() {
    23         HttpParams params = new BasicHttpParams();
    24         params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,
    25                 this.connTimeout);
    26         params.setParameter(CoreConnectionPNames.SO_TIMEOUT, this.soTimeout);
    27         params.setParameter(CoreConnectionPNames.SO_REUSEADDR, true);
    28         params.setParameter(CoreConnectionPNames.TCP_NODELAY, false);
    29         params.setParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE,
    30                 this.bufSize);
    31         params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
    32                 HttpVersion.HTTP_1_1);
    33         params.setParameter(CoreProtocolPNames.USER_AGENT, this.agent);
    34         params.setParameter(ClientPNames.CONNECTION_MANAGER_FACTORY_CLASS_NAME,
    35                 "org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager");
    36         params.setParameter(ClientPNames.MAX_REDIRECTS, this.maxRedirect);
    37         ThreadSafeClientConnManager ccm = new ThreadSafeClientConnManager();
    38         ccm.setMaxTotal(this.maxTotal);
    39         ccm.setDefaultMaxPerRoute(this.maxPerRoute);
    40         return new DefaultHttpClient(ccm, params);
    41     }
    42 
    43     public long getConnTimeout() {
    44         return connTimeout;
    45     }
    46 
    47     public void setConnTimeout(int connTimeout) {
    48         this.connTimeout = connTimeout;
    49     }
    50 
    51     public long getSoTimeout() {
    52         return soTimeout;
    53     }
    54 
    55     public void setSoTimeout(int soTimeout) {
    56         this.soTimeout = soTimeout;
    57     }
    58 
    59     public int getBufSize() {
    60         return bufSize;
    61     }
    62 
    63     public void setBufSize(int bufSize) {
    64         this.bufSize = bufSize;
    65     }
    66 
    67     public String getAgent() {
    68         return agent;
    69     }
    70 
    71     public void setAgent(String agent) {
    72         this.agent = agent;
    73     }
    74 
    75     public int getMaxRedirect() {
    76         return maxRedirect;
    77     }
    78 
    79     public void setMaxRedirect(int maxRedirect) {
    80         this.maxRedirect = maxRedirect;
    81     }
    82 
    83     public int getMaxTotal() {
    84         return maxTotal;
    85     }
    86 
    87     public void setMaxTotal(int maxTotal) {
    88         this.maxTotal = maxTotal;
    89     }
    90 
    91     public int getMaxPerRoute() {
    92         return maxPerRoute;
    93     }
    94 
    95     public void setMaxPerRoute(int maxPerRoute) {
    96         this.maxPerRoute = maxPerRoute;
    97     }
    98 }
  • 相关阅读:
    C# Redis实战(四)
    C# Redis实战(三)
    C# Redis实战(二)
    C# Redis实战(一)
    C#连接内存数据库redis【1、Redis存读取数据】
    C#连接内存数据库redis【1、安装配置】
    c#根据配置文件反射
    内存数据库:Redis与Memcached的区别
    内存数据库:memcached与redis技术的对比试验
    【转】【涨姿势】支付宝怎么做风险控制?
  • 原文地址:https://www.cnblogs.com/icoding/p/2599676.html
Copyright © 2011-2022 走看看