RestTemplate配置

172 阅读1分钟
/**
 * http连接管理器
 * @return
 */
@Bean
public HttpClientConnectionManager poolingHttpClientConnectionManager() {
    PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
    // 最大连接数
    poolingHttpClientConnectionManager.setMaxTotal(500);
    // 同路由并发数(每个主机的并发)
    poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
    return poolingHttpClientConnectionManager;
}

/**
 * HttpClient
 * @param poolingHttpClientConnectionManager
 * @return
 */
@Bean
public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {
    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
    // 设置http连接管理器
    httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
    return httpClientBuilder.build();
}

/**
 * 请求连接池配置
 * @param httpClient
 * @return
 */
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
    // httpClient创建器
    clientHttpRequestFactory.setHttpClient(httpClient);
    // 连接超时时间/毫秒(连接上服务器(握手成功)的时间,超出抛出connect timeout)
    clientHttpRequestFactory.setConnectTimeout(20 * 1000);
    // 数据读取超时时间(socketTimeout)/毫秒(务器返回数据(response)的时间,超过抛出read timeout)
    clientHttpRequestFactory.setReadTimeout(20 * 1000);
    // 连接池获取请求连接的超时时间,不宜过长,必须设置/毫秒(超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool)
    clientHttpRequestFactory.setConnectionRequestTimeout(20 * 1000);
    return clientHttpRequestFactory;
}

/**
 * rest模板
 * @return
 */
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
    // boot中可使用RestTemplateBuilder.build创建
    RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
    List<HttpMessageConverter<?>> messageConverters =
            restTemplate.getMessageConverters();
    Iterator<HttpMessageConverter<?>> iterator=messageConverters.iterator();
    if(iterator.hasNext()){
        HttpMessageConverter<?> converter=iterator.next();
        //原有的String是ISO-8859-1编码 去掉
        if(converter instanceof StringHttpMessageConverter){
            iterator.remove();
        }
    }
    messageConverters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
    return restTemplate;
}