package com.huaxu.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.Autowired; 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; /** * @author 孤 * @version v1.0 * @Developers 张耀烽 * @serviceProvider 四叶草安全(SeClover) * @description http工厂配置 * @date */ @Configuration public class RestTemplateConfig { @Autowired private ApplicationValues appValues; @Bean public RestTemplate restTemplate() { return new RestTemplate(httpRequestFactory()); } @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean public HttpClient httpClient() { Registry registry = RegistryBuilder.create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); connectionManager.setMaxTotal(appValues.getMaxTotal()); connectionManager.setDefaultMaxPerRoute(appValues.getMaxPerRoute()); connectionManager.setValidateAfterInactivity(appValues.getInactivity()); RequestConfig requestConfig = RequestConfig.custom() //服务器返回数据(response)的时间,超过抛出read timeout .setSocketTimeout(appValues.getSocketTimeout()) //连接上服务器(握手成功)的时间,超出抛出connect timeout .setConnectTimeout(appValues.getConnTimeOut()) //从连接池中获取连接的超时时间,超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool .setConnectionRequestTimeout(appValues.getConnReqTimeOut()) .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); } }