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 :
A la fin de chaque thread je ferme son client :
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();
Mes problèmes
Code : Sélectionner tout - Visualiser dans une fenêtre à part client.close()
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 !
Partager