1.maven依賴
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.連接池配置
#最大連接數 http: maxTotal: 100 #並發數 defaultMaxPerRoute: 20 #創建連接的最長時間 connectTimeout: 1000 #從連接池中獲取到連接的最長時間 connectionRequestTimeout: 500 #數據傳輸的最長時間 socketTimeout: 10000 #提交請求前測試連接是否可用 staleConnectionCheckEnabled: true #可用空閑連接過期時間,重用空閑連接時會先檢查是否空閑時間超過這個時間,如果超過,釋放socket重新建立 validateAfterInactivity: 3000000
3.連接池初始化
package cn.likui.study.config; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.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.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; /** * @Description: https://www.cnblogs.com/yuexiaoyun/articles/13034028.html * @Author: ldg * @Date: 2020/10/9 */ @Configuration public class RestTemplateConfig { @Value("${http.maxTotal}") private Integer maxTotal; @Value("${http.defaultMaxPerRoute}") private Integer defaultMaxPerRoute; @Value("${http.connectTimeout}") private Integer connectTimeout; @Value("${http.connectionRequestTimeout}") private Integer connectionRequestTimeout; @Value("${http.socketTimeout}") private Integer socketTimeout; @Value("${http.staleConnectionCheckEnabled}") private boolean staleConnectionCheckEnabled; @Value("${http.validateAfterInactivity}") private Integer validateAfterInactivity; @Bean public RestTemplate restTemplate() { return new RestTemplate(httpRequestFactory()); } @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean public HttpClient httpClient() { Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); // 最大連接數 connectionManager.setMaxTotal(maxTotal); //單個路由最大連接數 connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); // 最大空間時間 connectionManager.setValidateAfterInactivity(validateAfterInactivity); RequestConfig requestConfig = RequestConfig.custom() //服務器返回數據(response)的時間,超過拋出read timeout .setSocketTimeout(socketTimeout) //連接上服務器(握手成功)的時間,超出拋出connect timeout .setConnectTimeout(connectTimeout) // 提交前檢測是否可用 .setStaleConnectionCheckEnabled(staleConnectionCheckEnabled) //從連接池中獲取連接的超時時間,超時間未拿到可用連接,會拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool .setConnectionRequestTimeout(connectionRequestTimeout) .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); } }
4.示例
@RequestMapping("/testRestTemplate") @ResponseBody public Object testRestTemplate() throws IOException { ResponseEntity result= restTemplate.getForEntity("http://192.168.1.100:8080/User/getAllUser",ResponseEntity.class); return result.getBody(); }
感謝:https://www.cnblogs.com/yuexiaoyun/articles/13034028.html