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:
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:
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 !