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 !