Apache HTTPClient ne pas faire plus de 2 connexions

J'ai essayé de mettre en œuvre le regroupement de connexion pour mon application en utilisant Apache HTTPClient (v4.1). Le problème est que le client fait toujours seulement deux connexions lors de l'exécuter, si il y a assez de threads s'exécutant en parallèle. J'ai essayé de modifier le code pour un certain temps maintenant, mais rien n'a aidé encore.

Je suis en utilisant ThreadSafeClientConnManager pour le regroupement de connexions et de définir la MaxTotal et DefaulMaxPerRoute à des valeurs que je veux.


Est-il quelque chose qui vous vient à l'esprit en premier pour que je puisse vous voulez vérifier?

Voici ce segment de code que j'utilise pour créer le client.

DefaultHttpClient createClient() {
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

    params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(60000));
    params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(60000));
    params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true);

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("https", sf, 6443));
    registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, registry);
    cm.setMaxTotal(2 * maxConnections);
    cm.setDefaultMaxPerRoute(maxConnections);

    HttpHost localhost = new HttpHost("localhost");
    cm.setMaxForRoute(new HttpRoute(localhost), maxConnections);

    HttpHost sdpTargetHost = new HttpHost("webserviceIP", webservicePort, "https");
    cm.setMaxForRoute(new HttpRoute(sdpTargetHost, null, true), maxConnections);

    return new DefaultHttpClient(cm, params);
}

Le client est retourné par cette fonction est utilisée dans Runnables géré par un ThreadPoolExecutor. Le Runnables utilisez le client, et a ces lignes:

HttpResponse response = httpClient.execute(httpPost, context);
HttpEntity entity = response.getEntity();
....
EntityUtils.consume(entity);

De ce que je sais, le EntityUtils.consume(entity) informera le gestionnaire de connexion que la connexion n'est plus utilisé, et donc la libération de la connexion utilisée par d'autres threads. Donc je suppose que la gestion de la connexion est ok.

Je suppose que j'ai fourni suffisamment d'informations, s'il vous plaît dites-moi si je suis à ajouter quelque chose de plus.

Grâce

Peut-être le même: stackoverflow.com/questions/7597447/...
La meilleure façon de résoudre les HttpClient problèmes est en tournant sur son fil / contexte de l'exploitation forestière. Suivez les instructions de l'enregistrement guide hc.apache.org/httpcomponents-client-ga/logging.html et activer le contexte de la journalisation pour la gestion de la connexion / exécution de la requête. Cela vous aidera à voir les stats de l'individu par la route des pools de connexion et vous permet également de voir si les connexions obtenir correctement remis au gestionnaire de connexion.
Est ce risque encore d'être un problème? Il semble que le correctif a été arbitraire, et shyam conclu avec " je présume que c'est probablement certains sorta bug dans le HttpClient 4.1 API.". Je vois un problème similaire et ne veulent pas se trémousser code.
Il n'y a rien à corriger. On doit configurer le pool de connexion pour permettre à plus de 2 connexions simultanées par la route.

OriginalL'auteur shyam | 2011-10-07