2017-02-24 2 views
0

J'essaye d'implémenter un pool de connexion http dans java pour un service web. Le service recevra une demande, puis appellera d'autres services http.Stratégie d'éviction de connexion dans le pool de connexion HTTP en Java

public final class HttpClientPool { 
private static HttpClientPool instance = null; 
private PoolingHttpClientConnectionManager manager; 
private IdleConnectionMonitorThread monitorThread; 
private final CloseableHttpClient client; 

public static HttpClientPool getInstance() { 
    if (instance == null) { 
    synchronized(HttpClientPool.class) { 
    if (instance == null) { 
    instance = new HttpClientPool(); 
    } 
    } 
    } 
    return instance; 
} 

private HttpClientPool() { 
    manager = new PoolingHttpClientConnectionManager(); 
    client = HttpClients.custom().setConnectionManager(manager).build(); 
    monitorThread = new IdleConnectionMonitorThread(manager); 
    monitorThread.setDaemon(true); 
    monitorThread.start(); 
} 

public CloseableHttpClient getClient() { 
    return client; 
} 
} 


class IdleConnectionMonitorThread extends Thread { 
private final HttpClientConnectionManager connMgr; 
private volatile boolean shutdown; 

IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) { 
    super(); 
    this.connMgr = connMgr; 
} 

@Override 
public void run() { 
    try { 
    while (!shutdown) { 
    synchronized(this) { 
    wait(5000); 
    // Close expired connections 
    connMgr.closeExpiredConnections(); 
    // Optionally, close connections 
    // that have been idle longer than 30 sec 
    connMgr.closeIdleConnections(60, TimeUnit.SECONDS); 
    } 
    } 
    } catch (InterruptedException ex) { 
    // 
    } 
} 

void shutdown() { 
    shutdown = true; 
    synchronized(this) { 
    notifyAll(); 
    } 
} 
} 
  1. Comme mentionné dans Connection Management doc pour la connexion stratégie Eviction au lieu d'utiliser un IdleConnectionMonitorThread si j'utilise manager.setValidateAfterInactivity. Quels sont les avantages & contre les deux approches ci-dessus?

  2. L'implémentation du pool de connexions Http ci-dessus est-elle correcte?

Répondre

1

Avec #setValidateAfterInactivity avec une valeur positive, les connexions persistantes seront validées lors de la demande de location. Autrement dit, les connexions périmées et non réutilisables ne seront pas automatiquement expulsées du pool tant qu'une tentative de réutilisation n'aura pas été effectuée. L'exécution d'un thread dédié qui itère sur des connexions persistantes à l'intervalle de temps spécifié et supprime les connexions expirées ou inactives du pool garantit une éviction de connexion proactive au prix d'un thread supplémentaire et un conflit de verrou de pool légèrement supérieur.

+0

Dans le lien que j'ai posté dans ma question https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d5e418. Il est mentionné 'La vérification de la connexion périmée n'est pas fiable à 100%. La seule solution réalisable qui n'implique pas un modèle de thread par socket pour les connexions inactives est un thread de monitoring dédié. Est-ce que cela vaut également pour 'setValidateAfterInactivity'? – tuk

+0

Oui, c'est le cas. Étant donné que la vérification de connexion périmée est relativement chère, HttpClient à partir de la version 4.4 ne vérifie plus toutes les connexions mais seulement celles qui sont restées inactives pendant un certain temps – oleg

+0

Si je règle correctement setValidateAfterInactivity, je vais vérifier si une connexion est correcte est inactif pour autant de ms comme spécifié dans 'setValidateAfterInactivity', même s'il n'est pas fiable. Si nous voulons une fiabilité totale, alors nous devrions utiliser l'approche 'IdleMonitorThread'? – tuk