package com.billpaymentservice.bbps.config; import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.apache.hc.core5.util.TimeValue; import org.apache.hc.core5.util.Timeout; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { // ✅ Timeout config RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(Timeout.ofSeconds(5)) // pool wait .setConnectTimeout(Timeout.ofSeconds(5)) // TCP connect .setResponseTimeout(Timeout.ofSeconds(10)) // response read .build(); // ✅ Connection pool manager (HttpClient5 style) var connManager = PoolingHttpClientConnectionManagerBuilder.create() .setMaxConnTotal(200) .setMaxConnPerRoute(50) .build(); // ✅ Build HttpClient CloseableHttpClient httpClient = HttpClients.custom() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connManager) .disableAutomaticRetries() .evictExpiredConnections() .evictIdleConnections(TimeValue.ofSeconds(30)) .build(); // ✅ Bind RestTemplate with HttpClient HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); factory.setBufferRequestBody(true); return new RestTemplate(factory); } }