SpringBoot 对RestTemplate的初始化

代码部分:

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;

/**

* 声明并初始化连接池用于调用外部服务接口

*/@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) //服务器返回数据(response)的时间,超过抛出read timeout                

                .setConnectTimeout(httpPoolProperties.connectTimeout) //连接上服务器(握手成功)的时间,超出抛出connect timeout   

                 .setConnectionRequestTimeout(httpPoolProperties.connectionRequestTimeout)//从连接池中获取连接的超时时间,超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool                

                .build();

                return HttpClientBuilder.create()

                .setDefaultRequestConfig(requestConfig)

                .setConnectionManager(connectionManager)

                .build();

    }

}

参数部分(application.yml文件)

httpclient:

     # 最大连接数

     maxtotal: 64 

     # 每个route默认的最大连接数

     defaultMaxPerRoute: 64 

     # 连接上服务器(握手成功)的时间,超出抛出connect timeout 

     connectTimeout: 10000 

     # 从连接池中获取连接的超时时间,超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 

     connectionRequestTimeout: 10000 

     # 服务器返回数据(response)的时间,超过抛出read timeout 

     socketTimeout: 10000 

     # 存活时间 

     validateAfterInactivity: 10000

从yml中获取参数(HttpPoolConfig.java)

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Configuration;

/**

* 用于声明连接池的相关配置信息

*/@Configurationpublic classHttpPoolConfig{

    @Value("${httpclient.maxtotal}")    public Integer maxTotal;

    @Value("${httpclient.defaultMaxPerRoute}")    public Integer defaultMaxPerRoute;

    /**

    * 连接上服务器(握手成功)的时间,超出抛出connect timeout

    */    @Value("${httpclient.connectTimeout}")    public Integer connectTimeout;

    /**

    * 从连接池中获取连接的超时时间,超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

    */    @Value("${httpclient.connectionRequestTimeout}")    public Integer connectionRequestTimeout;

    /**

    * 服务器返回数据(response)的时间,超过抛出read timeout

    */    @Value("${httpclient.socketTimeout}")    public Integer socketTimeout;

    @Value("${httpclient.validateAfterInactivity}")    public Integer validateAfterInactivity;

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容