diff --git a/pom.xml b/pom.xml index ab13dbab9..f2374a202 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 07fcaa17d..f5bcac1ef 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++) {