@Configuration
@RefreshScope
public class RestTemplateConfig {
@Value("${http.max.total}")
private Integer httpMaxTotal;
@Value("${http.max.per.route : 100}")
private Integer httpDefaultMaxPerRoute;
@Value("${http.socket.time.out : 30000}")
private Integer httpSocketTimeout;
@Value("${http.connect.time.out : 10000}")
private Integer httpConnectTimeout;
@Value("${http.connect.req.time.out : 1000}")
private Integer httpConnectionRequestTimeout;
@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);
//设置整个连接池最大连接数 400
connectionManager.setMaxTotal(httpMaxTotal);
//路由是对maxTotal的细分
connectionManager.setDefaultMaxPerRoute(httpDefaultMaxPerRoute);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(httpSocketTimeout) //返回数据的超时时间
.setConnectTimeout(httpConnectTimeout) //连接上服务器的超时时间
.setConnectionRequestTimeout(httpConnectionRequestTimeout) //从连接池中获取连接的超时时间
.build();
return HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.build();
}
}