【问题标题】:HttpClient's pooled connectionManager to recover from server closed connectionHttpClient 的池连接管理器从服务器关闭的连接中恢复
【发布时间】:2016-02-26 15:28:44
【问题描述】:
当使用池化connectionManager时,池中的连接可能会在空闲一段时间后被服务器断开,但对象可能会在被驱逐之前留在池中,稍后可能会被http请求使用。然后它会因 IOException 而失败。
我们如何从中恢复。我只能想到重试http请求。 connectionManager 有没有办法检测到这一点并丢弃连接? (顺便说一句,驱逐线程不能保证。)
【问题讨论】:
标签:
connection
httpclient
pool
【解决方案1】:
当我深入研究 PoolingHttpClientconnectionManager 并链接 HttpClient 4 源代码时,我发现在使用之前使用 isStale() 检查了连接。两个有趣的点:
池保留连接对象,但不一定是连接的。如果借用的连接对象断开连接,它会重新连接。
我有一个 connectionPool 实现,其中我销毁了一个断开连接的对象并再次从池中借用。池中所有新创建的对象最初都是连接的。
不知何故,我喜欢他们的方法。
isStale() 实现很有趣,它尝试以 1 毫秒的超时时间从套接字 inputStream 中读取数据,如果返回 -1 或除 SocketTimeoutException 之外的任何异常,则声明它已过时。
每次使用连接时都会检查 isStale()。我不喜欢它。我更喜欢在失败时重试发送请求的方法,因为大多数时候连接应该是好的并且不需要 isStale() 检查。