CloseableHttpAsyncClient的TimeoutException

时间:2017-02-07 12:18:25

标签: java connection-pooling apache-httpcomponents

我正在尝试使用CloseableHttpAsyncClient连接使用api。我用连接池45和超时5分钟调用api。但是,我收到以下错误:

java.util.concurrent.TimeoutException: null
    at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:364)
    at org.apache.http.nio.pool.AbstractNIOConnPool.processNextPendingRequest(AbstractNIOConnPool.java:344)
    at org.apache.http.nio.pool.AbstractNIOConnPool.release(AbstractNIOConnPool.java:318)
    at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.releaseConnection(PoolingNHttpClientConnectionManager.java:303)
    at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.releaseConnection(AbstractClientExchangeHandler.java:239)
    at org.apache.http.impl.nio.client.MainClientExec.responseCompleted(MainClientExec.java:387)
    at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:168)
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:436)
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:326)
    at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265)
    at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
    at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
    at java.lang.Thread.run(Thread.java:745)

然后,在将连接池大小减小到10时,抛出错误的次数会减少。

我正在使用CloseableHttpAsyncClient的单例实例,并且不要关闭它以便更快地调用。

这就是我所说的:

httpclient.execute(post, new FutureCallback<HttpResponse>(....));
我认为,这不是来自api方面。 知道这个异常发生了什么,它是否与连接池有任何连接?

1 个答案:

答案 0 :(得分:3)

通过查看源代码,当您将connectionRequestTimeout设置为不同于连接管理器中的默认值(-1)(例如PoolingNHttpClientConnectionManager)时,会发生这种情况。如果池非常繁忙且超时不够,则会抛出此异常。

要解决此问题,请增加连接管理器池的connectionRequestTimeout或将其设置为-1(无限期等待)。