参考
https://blog.csdn.net/sinat_27818621/article/details/118389966
https://blog.csdn.net/m0_37779977/article/details/105707183
@Bean
public ClientHttpRequestFactory clientFactory(ProxyConfig proxyConfig) {
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory()).build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
connectionManager.setMaxTotal(100);
connectionManager.setDefaultMaxPerRoute(200);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(60000)
.setConnectTimeout(60000)
.setConnectionRequestTimeout(10000)
.setCookieSpec(CookieSpecs.STANDARD)
.build();
ServiceUnavailableRetryStrategy serviceUnavailStrategy = new ServiceUnavailableRetryStrategy() {
@Override
public boolean retryRequest(HttpResponse httpResponse, int executionCount, HttpContext httpContext) {
log.info("请求超时,重试Strategy{}次.", executionCount);
return executionCount < 3;
}
@Override
public long getRetryInterval() {
return 1000;
}
};
CloseableHttpClient closeableHttpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig)
.setProxy(proxyConfig.getEnabled() ? new HttpHost(proxyConfig.getHost(), proxyConfig.getPort(), "http") : null)
.setRetryHandler((exception, executionCount, context) -> {
if (executionCount > 3) {
return false;
}
String msg = exception.getMessage();
System.out.println("msg = " + msg);
if (msg.equals("Read timed out")) {
log.info("请求超时,Handler重试{}次.", executionCount);
return true;
}
return false;
})
.setServiceUnavailableRetryStrategy(serviceUnavailStrategy)
.build();
return new HttpComponentsClientHttpRequestFactory(closeableHttpClient);
}
疑问:setRetryHandler和setServiceUnavailableRetryStrategy按理说设置其中一个就ok,设置前者时候有时候不重试,回头有时间再整理