From a1e56a8c963da1163e8baf47d44820fc9ffac922 Mon Sep 17 00:00:00 2001 From: Joris Mancini Date: Thu, 19 Jun 2025 15:24:42 +0200 Subject: [PATCH] feat: make http client pool connections configurable and increase default values Signed-off-by: Joris Mancini --- pom.xml | 10 +++---- .../study/server/RestTemplateConfig.java | 27 +++++++++++++++++-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index ab13dbab90..f2374a202a 100644 --- a/pom.xml +++ b/pom.xml @@ -161,6 +161,10 @@ io.projectreactor reactor-core + + org.apache.httpcomponents.client5 + httpclient5 + org.projectlombok lombok @@ -196,12 +200,6 @@ - - - org.apache.httpcomponents.client5 - httpclient5 - runtime - org.liquibase liquibase-core diff --git a/src/main/java/org/gridsuite/study/server/RestTemplateConfig.java b/src/main/java/org/gridsuite/study/server/RestTemplateConfig.java index 07fcaa17de..f5bcac1ef7 100644 --- a/src/main/java/org/gridsuite/study/server/RestTemplateConfig.java +++ b/src/main/java/org/gridsuite/study/server/RestTemplateConfig.java @@ -20,6 +20,10 @@ import com.powsybl.sensitivity.json.SensitivityJsonModule; import com.powsybl.shortcircuit.json.ShortCircuitAnalysisJsonModule; import com.powsybl.timeseries.json.TimeSeriesJsonModule; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; @@ -31,9 +35,28 @@ @Configuration public class RestTemplateConfig { + @Value("${http.client.pool.max-connections:500}") + private int httpClientPoolMaxConnections; + + @Value("${http.client.pool.max-connections-per-host:200}") + private int httpClientPoolMaxConnectionsPerHost; + + @Bean + public HttpClient httpClient() { + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + // By default, it's limited to 20 connections and 5 connections per host which is very too low for study-server needs + connectionManager.setMaxTotal(httpClientPoolMaxConnections); + connectionManager.setDefaultMaxPerRoute(httpClientPoolMaxConnectionsPerHost); + + return HttpClients.custom() + .setConnectionManager(connectionManager) + .build(); + } + @Bean - public RestTemplate restTemplate() { - final RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); + public RestTemplate restTemplate(HttpClient httpClient) { + // We're using HttpComponentsClientHttpRequestFactory from apache httpclient5 to handle properly HTTP PATCH method + final RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient)); //find and replace Jackson message converter with our own for (int i = 0; i < restTemplate.getMessageConverters().size(); i++) {