spring的RestTemplate鏈接池相關配置

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;
    }
}
相關文章
相關標籤/搜索