IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Gestion des Pool de connexion avec Apache


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 42
    Points
    42
    Par défaut Gestion des Pool de connexion avec Apache
    Bonjour,

    Je cherche à effectuer plusieurs requêtes HTTP en parallèle avec Java. Pour cela j'utilise plusieurs threads et les outils Apache (org.apache.http)

    Ce que j'ai implémenté

    Mon thread principal créé le pool et les configurations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    private PoolingHttpClientConnectionManager	connecManager;
    private RequestConfig				reqConfig;
    private RotatingProxiesRoutePlanner		routePlanner;
    private ConnectionKeepAliveStrategy		strategy;
     
    [...]
     
    // Init pool connection manager
    this.connecManager = new PoolingHttpClientConnectionManager();
    this.connecManager.setMaxTotal(settings.getMaxLoadPage());
    this.connecManager.setDefaultMaxPerRoute(settings.getMaxLoadPage());
     
    // Set request config
    this.reqConfig = RequestConfig.custom().setConnectTimeout(settings.getTimeout())
    					.setSocketTimeout(settings.getTimeout())
    					.setConnectionRequestTimeout(settings.getTimeout()).build();
     
    this.routePlanner = new RotatingProxiesRoutePlanner(settings.getProxies());
     
    final int keepAlive = settings.getTimeout();
    this.strategy = new ConnectionKeepAliveStrategy()
    {
    	@Override
    	public long getKeepAliveDuration(HttpResponse response, HttpContext context)
    	{
    		return keepAlive;
    	}
    };

    A chaque fois que je créé un thread je lui passe un nouveau client Http que j’initialise de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CloseableHttpClient client = HttpClients.custom().setConnectionManager(this.connecManager)
    						.setDefaultRequestConfig(this.reqConfig)
    						.setKeepAliveStrategy(this.strategy)
    						.builder.setRoutePlanner(this.routePlanner)
    						.build();
    A la fin de chaque thread je ferme son client :
    Mes problèmes

    Lorsque le 1er thread se termine le fait de fermer son client Http fait planter tous les autres threads. Tous les threads en cours lancent un : "java.lang.IllegalStateException: Connection pool shut down"
    Je ne comprends pas pourquoi fermer un client perturbe toutes les autres connexions.

    Mon second problème, qui n'est surement pas lié, c'est la perte de performance énorme que j'observe lors de l'utilisation de proxy dans la route. Le temps de réponse est au moins multiplié par 10 à chaque requête. J'ai essayé avec plusieurs proxy payant différent et les résultats sont toujours similaire. Ce qui me fait pensé que je dois mal faire quelque chose.
    J'ai régulièrement des timeout (java.net.SocketTimeoutException) et des connexion refusé lors de l'utilisation des proxy


    J'espère que vous avez des idées à me proposer car moi je suis à court !

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    D'après la javadoc

    public final HttpClientBuilder setConnectionManagerShared(boolean shared)
    Defines the connection manager is to be shared by multiple client instances.
    If the connection manager is shared its life-cycle is expected to be managed by the caller and it will not be shut down if the client is closed.
    Essayes de rajouter un setConnectionManagerShared(true) pour éviter que ça coupe à la première fermeture de connexion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CloseableHttpClient client = HttpClients.custom().setConnectionManager(this.connecManager)
    						.setDefaultRequestConfig(this.reqConfig)
    						.setKeepAliveStrategy(this.strategy).setConnectionManagerShared(true)
    						.builder.setRoutePlanner(this.routePlanner)
    						.build();

    Pour le proxy, faudrait nous préciser quel type de proxy, dans quelle configuration réseau (quelle source, où est le proxy, quelle destination)

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    J'arrive effectivement à fermer les clients au fur et à mesure avec setConnectionManagerShared(true). Je ne sais pas comment j'ai pu passer à coté après tous les exemples que j'ai vu, merci beaucoup.

    Par contre j'ai toujours des "SocketTimeoutException : Read timed out" un peu aléatoire même avec un timeout de 14 secondes.

    Pour le proxy

    J'ai une liste de proxy distant que je loue à un tiers.
    Je choisi le proxy dans une liste grâce à une implémentation de HttpRoutePlanner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class RotatingProxiesRoutePlanner implements HttpRoutePlanner
    {
    	private List<Proxy> 		proxies;
    	private Iterator<Proxy> 	proxiesIt;
     
    	public RotatingProxiesRoutePlanner(List<Proxy> proxies)
    	{
    		this.proxies = proxies;
    		this.proxiesIt = null;
    	}
     
    	@Override
    	public HttpRoute determineRoute(HttpHost target, HttpRequest request, HttpContext context) throws HttpException
    	{
    		Proxy proxy;
     
    		// if no proxy
    		if(this.proxies.size() <= 0)
    			return null;
     
    		// if only 1 proxy
    		if(this.proxies.size() == 1)
    			proxy = this.proxies.get(0);
    		else
    		{
    			[...] sélection d un proxy dans la liste
    		}
     
    		return new HttpRoute(target, new HttpHost(proxy.getHost(), proxy.getPort());
    	}
    }
    L'application est exécuter sur un serveur personnel et la requête HTTP est à destination d'un serveur web.

    La route doit faire : serveur perso -> proxy distant -> serveur web.

    J'ai fait des mesures un peu plus précise et mes requêtes sont bien de 3 à 10 fois plus longues avec le proxy.

Discussions similaires

  1. Pool de connexion avec struts
    Par vikrem dans le forum Struts 1
    Réponses: 6
    Dernier message: 27/08/2006, 23h25
  2. [Oracle] [PHP] Gestion des erreurs de connexion
    Par Mimo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/06/2006, 01h17
  3. Réponses: 4
    Dernier message: 03/02/2006, 11h06
  4. [VB6 + Mysql]Gestion des erreurs de connexion
    Par Deejoh dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/01/2006, 20h01
  5. Pool de connexion avec Tomcat 5.5
    Par partyboy dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 13/06/2005, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo