2010-09-05 5 views
2

J'utilise apache commons 4.x HTTPClient pour envoyer des requêtes HEAD aux URI uniquement pour obtenir l'emplacement final de l'URL post-302 de ce lien. E.g: http://bit.ly/test1231 points vraiment à cnn.com ou quelque chose. Quel serait le moyen le meilleur et le plus efficace d'utiliser HttpClient pour y parvenir dans un serveur qui pourrait fonctionner pendant des mois sans fuite? En ce moment, je suis confronté au problème que toutes les x minutes tous les threads geler tout en essayant de tirer une connexion hors de la piscine et ils ont tous le temps.Performance la plus élevée pour les requêtes HEAD HTTPClient HEAD?

Je prévois d'avoir 100 threads de travail faisant la récupération, donc j'utilisais le gestionnaire de connexion Threaded.

MISE À JOUR Voici le code que je utilise pour obtenir un objet 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); 

Répondre

5

Très probablement, vous avez trop de threads de travail se disputaient très peu de connexions. S'il vous plaît assurez-vous que le maximum de connexions par limite de route est fixé à une valeur raisonnable (Par défaut, la limite est fixée à deux connexions simultanées comme requis par la spécification HTTP)

+0

merci oleg, j'ai mis à jour pour afficher mon code ... I Actuellement, il est réglé à 35 par hôte, mais si j'ai 100 threads tous essayant de frapper bit.ly en même temps peut-être que je devrais utiliser 100? – James

+0

Il est généralement recommandé d'avoir le même nombre de threads de travail que les connexions maximales par route. – oleg

+0

dois-je définir setConnectionStaleCheckingEnabled sur false? Si oui, comment cela est-il fait en utilisant httpclient 4.x? – James

Questions connexes