HttpClient的池连接管理器从服务器关闭连接恢复

时间:2016-02-26 15:28:45

标签: connection httpclient pool

当使用池连接管理器时,服务器在空闲一段时间后可能会断开池中的连接,但是该对象可能在被驱逐之前留在池中,并且稍后可能会被http请求使用。然后它会因IOException而失败。

我们如何从中恢复过来。我只能想到重试http请求。有没有一种方法connectionManager可以检测到这种情况并丢弃连接? (BTW,逐出线程不能保证它。)

1 个答案:

答案 0 :(得分:0)

当我挖掘PoolingHttpClientconnectionManager并链接HttpClient 4源代码时,我发现在使用之前使用isStale()检查了连接。两个有趣的观点:

  1. 池保留连接对象,但不一定连接。如果借用的连接对象已断开连接,则会重新连接。 我有一个connectionPool实现,我在其中销毁一个断开连接的对象并再次从池中借用。池中的所有新创建的对象最初都是连接的。 不知怎的,我喜欢他们的方法。

  2. isStale()实现很有意思,它尝试从套接字inputStream读取1毫秒超时,并声明如果-1返回或除SocketTimeoutException之外的任何异常都是陈旧的。 每次使用连接时都会检查isStale()。我不喜欢它。如果失败,我更喜欢重试发送请求的方法,因为大多数时候连接应该是好的并且不需要isStale()检查。