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();
}
}
}
Comme mentionné dans Connection Management doc pour la connexion stratégie Eviction au lieu d'utiliser un
IdleConnectionMonitorThread
si j'utilisemanager.setValidateAfterInactivity
. Quels sont les avantages & contre les deux approches ci-dessus?L'implémentation du pool de connexions Http ci-dessus est-elle correcte?
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
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
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