import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; /** * spring的RestTemplate鏈接池相關配置 * * @project common-utils * @fileName RestTemplateConfiguration.java * @Description * @author light-zhang * @date 2019年4月29日 * @version 1.0.0 */ @Configuration public class RestTemplatePoolConfig { /** * 讓spring管理RestTemplate,參數相關配置 * * @param builder * @return */ @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { RestTemplate restTemplate = builder.build();// 生成一個RestTemplate實例 restTemplate.setRequestFactory(clientHttpRequestFactory()); return restTemplate; } /** * 客戶端請求連接策略 * * @return */ @Bean public ClientHttpRequestFactory clientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); clientHttpRequestFactory.setHttpClient(httpClientBuilder().build()); clientHttpRequestFactory.setConnectTimeout(6000); // 鏈接超時時間/毫秒 clientHttpRequestFactory.setReadTimeout(6000); // 讀寫超時時間/毫秒 clientHttpRequestFactory.setConnectionRequestTimeout(5000);// 請求超時時間/毫秒 return clientHttpRequestFactory; } /** * 設置HTTP鏈接管理器,鏈接池相關配置管理 * * @return 客戶端連接管理器 */ @Bean public HttpClientBuilder httpClientBuilder() { HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); httpClientBuilder.setConnectionManager(poolingConnectionManager()); return httpClientBuilder; } /** * 連接線程池管理,能夠keep-alive不斷開連接請求,這樣速度會更快 MaxTotal 鏈接池最大鏈接數 DefaultMaxPerRoute * 每一個主機的併發 ValidateAfterInactivity * 可用空閒鏈接過時時間,重用空閒鏈接時會先檢查是否空閒時間超過這個時間,若是超過,釋放socket從新創建 * * @return */ @Bean public HttpClientConnectionManager poolingConnectionManager() { PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(); poolingConnectionManager.setMaxTotal(1000); poolingConnectionManager.setDefaultMaxPerRoute(5000); poolingConnectionManager.setValidateAfterInactivity(30000); return poolingConnectionManager; } }