我们得到连接池关闭错误,而执行超文本传输协议请求使用RestTemplate.
这不是一个频繁的错误。它在一个月内发生了大约3次,持续时间很短(不到一分钟)。
我们正在使用PoolingHttpClientConnectionManager,最大连接数为50,连接超时=60秒
@Bean
public RestTemplate restTemplate()
{
final RestTemplate restTemplate = new RestTemplate ( httpRequestFactory () );
return restTemplate;
}
@Bean
public ClientHttpRequestFactory httpRequestFactory()
{
return new HttpComponentsClientHttpRequestFactory ( httpClient () );
}
@Bean
public CloseableHttpClient httpClient()
{
final SSLContext sslcontext = SSLContexts.createSystemDefault ();
final X509HostnameVerifier hostnameVerifier = new BrowserCompatHostnameVerifier ();
final Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
.<ConnectionSocketFactory> create ()
.register ( "http", PlainConnectionSocketFactory.INSTANCE )
.register ( "https", new SSLConnectionSocketFactory ( sslcontext, hostnameVerifier ) )
.build ();
final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager (
socketFactoryRegistry );
connectionManager.setMaxTotal ( 50 );
final RequestConfig config = RequestConfig.custom ()
.setConnectTimeout ( 60000 ).build ();
final CloseableHttpClient defaultHttpClient = HttpClientBuilder
.create ().setConnectionManager ( connectionManager )
.setDefaultRequestConfig ( config ).build ();
LOGGER.info ( "Initializing CloseableHttpClient" );
return defaultHttpClient;
}
spring-webmvc版本4.0.6。释放;
httpclient版本4.3.5
确切的堆栈跟踪如下…
java.lang.IllegalStateException: Connection pool shut down
at org.apache.http.util.Asserts.check(Asserts.java:34) ~[httpcore-4.3.2.jar:4.3.2]
at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:169) ~[httpcore-4.3.2.jar:4.3.2]
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:221) ~[httpclient-4.3.5.jar:4.3.5]
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:158) ~[httpclient-4.3.5.jar:4.3.5]
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) ~[httpclient-4.3.5.jar:4.3.5]
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) ~[httpclient-4.3.5.jar:4.3.5]
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) ~[httpclient-4.3.5.jar:4.3.5]
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[httpclient-4.3.5.jar:4.3.5]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) ~[httpclient-4.3.5.jar:4.3.5]
at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:87) ~[spring-web-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:52) ~[spring-web-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:545) ~[spring-web-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506) ~[spring-web-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:243) ~[spring-web-4.0.6.RELEASE.jar:4.0.6.RELEASE]
尝试像这样更改您的代码:
HttpClients.custom().setConnectionManager(manager).setConnectionManagerShared(true).build();
setConnectionManagerShared将定义连接管理器将由多个客户端实例共享。