2010-09-05 200 views
2

我正在使用apache commons 4.x HTTPClient向HEAD請求URI以獲取該鏈接的最終302後URL位置。例如:http://bit.ly/test1231真的指向cnn.com或其他東西。使用HttpClient在服務器中實現這一點的最佳和最有效的方法是什麼?現在我遇到了這樣的問題,即每隔x分鐘,所有線程都會凍結,同時嘗試將連接從池中取出,並全部超時。Apache HTTPClient HEAD請求的最高性能?

我打算有100個工作線程進行抓取,所以我使用了Threaded連接管理器。

UPDATE這裏是代碼我使用的是得到一個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); 

回答

5

最有可能你有太多的工作線程爭用很少的連接。請確保將每個路由限制的最大連接數設置爲合理值(默認情況下,根據HTTP規範的要求,將限制設置爲兩個併發連接)

+0

感謝oleg,我已更新以顯示我的代碼... I目前它已經設置爲每個主機35,但是如果我有100個線程都試圖在同一時間bit.ly,也許我應該使用100? – James 2010-09-05 16:45:18

+0

通常建議使用與每個路由最大連接數相同的工作線程數。 – oleg 2010-09-05 17:05:58

+0

我應該setConnectionStaleCheckingEnabled設置爲false?如果是這樣,使用httpclient 4.x如何完成? – James 2010-09-05 18:27:51