0
使用RestTemplate執行http請求時,出現連接池關閉錯誤。java.lang.IllegalStateException:在使用Spring RestTemplate時關閉連接池
這不是一個頻繁的錯誤。它發生在一個月內約3次,持續時間很短(不到一分鐘)。
我們正在使用PoolingHttpClientConnectionManager用50個最大連接和connectTimeout = 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;
}
彈簧webmvc版本4.0.6.RELEASE;
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]
[Apache PoolingHttpClientConnectionManager引發非法狀態異常]的可能重複(http://stackoverflow.com/questions/25889925/apache-poolinghttpclientconnectionmanager-throwing-illegal-state-exception) – dskrvk