Высочайшая производительность для запросов Apache HTTPClient HEAD? - PullRequest
2 голосов
/ 05 сентября 2010

Я использую HTTP-клиент apache commons 4.x, чтобы отправлять HEAD-запросы только на URI, чтобы получить окончательный пост 302 URL-адреса этой ссылки.Например: http://bit.ly/test1231 действительно указывает на cnn.com или что-то еще.Каков наилучший и наиболее эффективный способ использования HttpClient для этого на сервере, который может работать месяцами без утечек?Прямо сейчас я сталкиваюсь с проблемой, что каждые x минут все потоки замирают при попытке вытащить соединение из пула, и они все истекают.

Я планирую, чтобы 100 рабочих потоков выполняли выборку, поэтому я использовал диспетчер многопоточных соединений.

ОБНОВЛЕНИЕ Вот код, который я использую для получения объекта httpClient

HttpParams httpParams = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);

HttpConnectionParams.setSoTimeout(httpParams, 5000);

ConnManagerParams.setMaxTotalConnections(httpParams, 5000);

HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);



ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRoute() {

   @Override

   public int getMaxForRoute(HttpRoute route) {

     return 35;

   }

 });

emptyCookieStore = new CookieStore() {

    @Override

    public void addCookie(Cookie cookie) {



    }

    ArrayList<Cookie> emptyList = new ArrayList<Cookie>();



    @Override

    public List<Cookie> getCookies() {

      return emptyList;

    }

    @Override

    public boolean clearExpired(Date date) {

      return false;

    }



    @Override

    public void clear() {

    }

  };



  // set request params

  httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);

  httpParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

  httpParams.setParameter("http.language.Accept-Language", "en-us");

  httpParams.setParameter("http.protocol.content-charset", "UTF-8");

  httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");

  httpParams.setParameter("Cache-Control", "max-age=0");

  SchemeRegistry schemeRegistry = new SchemeRegistry();

  schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

  schemeRegistry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));

  final ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParams,schemeRegistry);



  DefaultHttpClient httpClient = new DefaultHttpClient(cm, httpParams);

  httpClient.getParams().setParameter("http.conn-manager.timeout", 120000L);

  httpClient.getParams().setParameter("http.protocol.wait-for-continue", 10000L);

  httpClient.getParams().setParameter("http.tcp.nodelay", true);

1 Ответ

5 голосов
/ 05 сентября 2010

Скорее всего, у вас слишком много рабочих потоков, борющихся за очень небольшое количество соединений. Убедитесь, что максимальное количество подключений на маршрут ограничено разумным значением (по умолчанию ограничение установлено на два одновременных подключения в соответствии со спецификацией HTTP)

...