代碼部分:
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;
/**
* 聲明并初始化連接池用于調(diào)用外部服務(wù)接口
*/@Configurationpublic classRestTemplateConfig{
? ? @Autowired? ? private HttpPoolConfig httpPoolProperties;
? ? @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(httpPoolProperties.maxTotal);
? ? ? ? connectionManager.setDefaultMaxPerRoute(httpPoolProperties.defaultMaxPerRoute);
? ? ? ? connectionManager.setValidateAfterInactivity(httpPoolProperties.validateAfterInactivity);
? ? ? ? RequestConfig requestConfig = RequestConfig.custom()
? ? ? ? ? ? ? ? .setSocketTimeout(httpPoolProperties.socketTimeout) //服務(wù)器返回?cái)?shù)據(jù)(response)的時(shí)間,超過拋出read timeout? ? ? ? ? ? ? ??
????????????????.setConnectTimeout(httpPoolProperties.connectTimeout) //連接上服務(wù)器(握手成功)的時(shí)間,超出拋出connect timeout? ?
? ? ? ? ? ? ? ? ?.setConnectionRequestTimeout(httpPoolProperties.connectionRequestTimeout)//從連接池中獲取連接的超時(shí)時(shí)間盆顾,超時(shí)間未拿到可用連接丰榴,會(huì)拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool? ? ? ? ? ? ? ??
????????????????.build();
? ? ? ????????? return HttpClientBuilder.create()
? ? ? ? ? ? ? ? .setDefaultRequestConfig(requestConfig)
? ? ? ? ? ? ? ? .setConnectionManager(connectionManager)
? ? ? ? ? ? ? ? .build();
? ? }
}
參數(shù)部分(application.yml文件)
httpclient:
?????# 最大連接數(shù)
?????maxtotal: 64?
?????# 每個(gè)route默認(rèn)的最大連接數(shù)
?????defaultMaxPerRoute: 64?
?????# 連接上服務(wù)器(握手成功)的時(shí)間者祖,超出拋出connect timeout?
?????connectTimeout: 10000?
?????# 從連接池中獲取連接的超時(shí)時(shí)間缴川,超時(shí)間未拿到可用連接厕诡,會(huì)拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool?
?????connectionRequestTimeout: 10000?
?????# 服務(wù)器返回?cái)?shù)據(jù)(response)的時(shí)間,超過拋出read timeout?
?????socketTimeout: 10000?
?????# 存活時(shí)間?
?????validateAfterInactivity: 10000
從yml中獲取參數(shù)(HttpPoolConfig.java)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
/**
* 用于聲明連接池的相關(guān)配置信息
*/@Configurationpublic classHttpPoolConfig{
? ? @Value("${httpclient.maxtotal}")? ? public Integer maxTotal;
? ? @Value("${httpclient.defaultMaxPerRoute}")? ? public Integer defaultMaxPerRoute;
? ? /**
? ? * 連接上服務(wù)器(握手成功)的時(shí)間削解,超出拋出connect timeout
? ? */? ? @Value("${httpclient.connectTimeout}")? ? public Integer connectTimeout;
? ? /**
? ? * 從連接池中獲取連接的超時(shí)時(shí)間富弦,超時(shí)間未拿到可用連接,會(huì)拋出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
? ? */? ? @Value("${httpclient.connectionRequestTimeout}")? ? public Integer connectionRequestTimeout;
? ? /**
? ? * 服務(wù)器返回?cái)?shù)據(jù)(response)的時(shí)間氛驮,超過拋出read timeout
? ? */? ? @Value("${httpclient.socketTimeout}")? ? public Integer socketTimeout;
? ? @Value("${httpclient.validateAfterInactivity}")? ? public Integer validateAfterInactivity;
}