2015-04-07 824 views
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] 
+0

[Apache PoolingHttpClientConnectionManager引发非法状态异常]的可能重复(http://stackoverflow.com/questions/25889925/apache-poolinghttpclientconnectionmanager-throwing-illegal-state-exception) – dskrvk

回答

7

尝试改变你这样的代码:

HttpClients.custom().setConnectionManager(manager).setConnectionManagerShared(true).build(); 

的setConnectionManagerShared将定义了连接管理器将由多个客户端实例共享。

相关问题