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);
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
Il est généralement recommandé d'avoir le même nombre de threads de travail que les connexions maximales par route. – oleg
dois-je définir setConnectionStaleCheckingEnabled sur false? Si oui, comment cela est-il fait en utilisant httpclient 4.x? – James