package com.moon.server.config; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 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.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.List; /** * Rest模板配置类 * @author WWW */ @Configuration @ConditionalOnClass(value = {RestTemplate.class, HttpClient.class}) public class RestTemplateConfig { /** * 连接池的最大连接数默认为0 */ @Value("${remote.maxTotalConnect:0}") private int maxTotalConnect; /** * 单个主机的最大连接数 */ @Value("${remote.maxConnectPerRoute:1000}") private int maxConnectPerRoute; /** * 连接超时默认5s */ @Value("${remote.connectTimeout:5000}") private int connectTimeout; /** * 读取超时默认30s */ @Value("${remote.readTimeout:30000}") private int readTimeout; /** * 创建HTTP客户端工厂 * * @return 客户端工厂 */ private ClientHttpRequestFactory createFactory() { if (this.maxTotalConnect <= 0) { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(this.connectTimeout); factory.setReadTimeout(this.readTimeout); return factory; } HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect).setMaxConnPerRoute(this.maxConnectPerRoute).build(); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient); factory.setConnectTimeout(this.connectTimeout); factory.setReadTimeout(this.readTimeout); return factory; } /** * 初始化RestTemplate,并加入spring的Bean工厂,由spring统一管理 * 必须加注解@LoadBalanced * * @return */ @Bean @ConditionalOnMissingBean(RestTemplate.class) public RestTemplate getRestTemplate() { RestTemplate restTemplate = new RestTemplate(this.createFactory()); List> converterList = restTemplate.getMessageConverters(); // 重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题 HttpMessageConverter converterTarget = null; for (HttpMessageConverter item : converterList) { if (StringHttpMessageConverter.class == item.getClass()) { converterTarget = item; break; } } if (null != converterTarget) { converterList.remove(converterTarget); } converterList.add(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } }