|
@@ -51,61 +51,88 @@ public class HttpClientConfigurer {
|
|
|
private final ObjectMapper objectMapper;
|
|
|
private final HttpClientProperties httpClientProperties;
|
|
|
|
|
|
+ /**
|
|
|
+ * 修改默认的消息转换配置
|
|
|
+ *
|
|
|
+ * @param restTemplate RestTemplate实例
|
|
|
+ */
|
|
|
+ private void modifyDefaultMessageConverters(@NonNull RestTemplate restTemplate) {
|
|
|
+ List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters().stream()
|
|
|
+ .map(converter -> {
|
|
|
+ if (converter instanceof StringHttpMessageConverter) {
|
|
|
+ return new StringHttpMessageConverter(StandardCharsets.UTF_8);
|
|
|
+ } else if (converter instanceof MappingJackson2HttpMessageConverter) {
|
|
|
+ MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
|
|
|
+ new MappingJackson2HttpMessageConverter(this.objectMapper);
|
|
|
+ mappingJackson2HttpMessageConverter.setSupportedMediaTypes(
|
|
|
+ Arrays.asList(
|
|
|
+ MediaType.TEXT_PLAIN,
|
|
|
+ MediaType.APPLICATION_JSON,
|
|
|
+ new MediaType("application", "*+json")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ return mappingJackson2HttpMessageConverter;
|
|
|
+ }
|
|
|
+ return converter;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ restTemplate.setMessageConverters(messageConverters);
|
|
|
+ }
|
|
|
+
|
|
|
@Bean
|
|
|
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
|
|
|
- RestTemplate restTemplate = new RestTemplate(factory);
|
|
|
- this.modifyDefaultMessageConverters(restTemplate);
|
|
|
- return restTemplate;
|
|
|
+ RestTemplate template = new RestTemplate(factory);
|
|
|
+ this.modifyDefaultMessageConverters(template);
|
|
|
+ return template;
|
|
|
}
|
|
|
|
|
|
@Bean
|
|
|
public ClientHttpRequestFactory clientHttpRequestFactory() {
|
|
|
- HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
|
|
|
- new HttpComponentsClientHttpRequestFactory(this.httpClient());
|
|
|
+ HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(this.httpClient());
|
|
|
// 连接超时
|
|
|
- clientHttpRequestFactory.setConnectTimeout(this.httpClientProperties.getConnectTimeout());
|
|
|
+ factory.setConnectTimeout(this.httpClientProperties.getConnectTimeout());
|
|
|
// 数据读取超时时间,即SocketTimeout
|
|
|
- clientHttpRequestFactory.setReadTimeout(this.httpClientProperties.getSocketTimeout());
|
|
|
+ factory.setReadTimeout(this.httpClientProperties.getSocketTimeout());
|
|
|
// 从连接池获取请求连接的超时时间,不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
|
|
|
- clientHttpRequestFactory.setConnectionRequestTimeout(this.httpClientProperties.getConnectionRequestTimeout());
|
|
|
- return clientHttpRequestFactory;
|
|
|
+ factory.setConnectionRequestTimeout(this.httpClientProperties.getConnectionRequestTimeout());
|
|
|
+ return factory;
|
|
|
}
|
|
|
|
|
|
@Bean
|
|
|
public HttpClient httpClient() {
|
|
|
- HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
|
|
|
+ HttpClientBuilder builder = HttpClientBuilder.create();
|
|
|
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
|
|
|
registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
|
|
|
|
|
|
// 设置信任ssl访问
|
|
|
try {
|
|
|
- SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
|
|
|
- httpClientBuilder.setSSLContext(sslContext);
|
|
|
- SSLConnectionSocketFactory sslConnectionSocketFactory =
|
|
|
- new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
|
|
|
- registryBuilder.register("https", sslConnectionSocketFactory);
|
|
|
+ SSLContext ssl = new SSLContextBuilder().loadTrustMaterial(null, (chain, type) -> true).build();
|
|
|
+ builder.setSSLContext(ssl);
|
|
|
+ SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(ssl, NoopHostnameVerifier.INSTANCE);
|
|
|
+ registryBuilder.register("https", factory);
|
|
|
} catch (GeneralSecurityException e) {
|
|
|
log.warn("SSL setting failed: {}", e.getMessage());
|
|
|
}
|
|
|
|
|
|
- //使用Httpclient连接池的方式配置(推荐),同时支持netty,okHttp以及其他http框架
|
|
|
- PoolingHttpClientConnectionManager poolingHttpClientConnectionManager =
|
|
|
- new PoolingHttpClientConnectionManager(registryBuilder.build());
|
|
|
+ // 使用Httpclient连接池的方式配置(推荐),同时支持netty,okHttp以及其他http框架
|
|
|
+ PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(registryBuilder.build());
|
|
|
// 最大连接数
|
|
|
- poolingHttpClientConnectionManager.setMaxTotal(this.httpClientProperties.getMaxTotal());
|
|
|
+ manager.setMaxTotal(this.httpClientProperties.getMaxTotal());
|
|
|
// 同路由并发数
|
|
|
- poolingHttpClientConnectionManager.setDefaultMaxPerRoute(this.httpClientProperties.getMaxPerRoute());
|
|
|
- //配置连接池
|
|
|
- httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
|
|
|
+ manager.setDefaultMaxPerRoute(this.httpClientProperties.getMaxPerRoute());
|
|
|
+ // 配置连接池
|
|
|
+ builder.setConnectionManager(manager);
|
|
|
// 重试次数
|
|
|
- httpClientBuilder.setRetryHandler(this.httpRequestRetryHandler());
|
|
|
- //设置长连接保持策略
|
|
|
- httpClientBuilder.setKeepAliveStrategy(this.connectionKeepAliveStrategy());
|
|
|
+ builder.setRetryHandler(this.httpRequestRetryHandler());
|
|
|
+ // 设置长连接保持策略
|
|
|
+ builder.setKeepAliveStrategy(this.connectionKeepAliveStrategy());
|
|
|
+
|
|
|
+ // 设置后台线程剔除失效连接
|
|
|
+ builder.evictExpiredConnections();
|
|
|
+ builder.evictIdleConnections(this.httpClientProperties.getMaxIdleTime(), TimeUnit.MILLISECONDS);
|
|
|
|
|
|
- //设置后台线程剔除失效连接
|
|
|
- httpClientBuilder.evictExpiredConnections();
|
|
|
- httpClientBuilder.evictIdleConnections(this.httpClientProperties.getMaxIdleTime(), TimeUnit.MILLISECONDS);
|
|
|
- return httpClientBuilder.build();
|
|
|
+ // 禁用Cookie回话保持功能
|
|
|
+ builder.disableCookieManagement();
|
|
|
+ return builder.build();
|
|
|
}
|
|
|
|
|
|
@Bean
|
|
@@ -123,31 +150,4 @@ public class HttpClientConfigurer {
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
-
|
|
|
- /**
|
|
|
- * 修改默认的消息转换配置
|
|
|
- *
|
|
|
- * @param restTemplate RestTemplate实例
|
|
|
- */
|
|
|
- private void modifyDefaultMessageConverters(@NonNull RestTemplate restTemplate) {
|
|
|
- List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters().stream()
|
|
|
- .map(converter -> {
|
|
|
- if (converter instanceof StringHttpMessageConverter) {
|
|
|
- return new StringHttpMessageConverter(StandardCharsets.UTF_8);
|
|
|
- } else if (converter instanceof MappingJackson2HttpMessageConverter) {
|
|
|
- MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
|
|
|
- new MappingJackson2HttpMessageConverter(this.objectMapper);
|
|
|
- mappingJackson2HttpMessageConverter.setSupportedMediaTypes(
|
|
|
- Arrays.asList(
|
|
|
- MediaType.TEXT_PLAIN,
|
|
|
- MediaType.APPLICATION_JSON,
|
|
|
- new MediaType("application", "*+json")
|
|
|
- )
|
|
|
- );
|
|
|
- return mappingJackson2HttpMessageConverter;
|
|
|
- }
|
|
|
- return converter;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- restTemplate.setMessageConverters(messageConverters);
|
|
|
- }
|
|
|
}
|