【问题标题】:PoolingClientConnectionManager how to close socketsPoolingClientConnectionManager 如何关闭套接字
【发布时间】:2013-08-26 05:58:59
【问题描述】:

这个问题与 PoolingClientConnectionManager (HttpClient 4.2.5 API) 有关

我在池中最多有 5 个远程连接和一个包含 20 多个 url 的列表来下载文件。下载文件后我释放连接。但我没有给出任何超时值。从 5 个不同的 URL 下载文件后会发生什么。我认为我从文档中收集到的是第 6 个文件直到客户端检测到连接结束时才开始下载。是这样吗?从 URL 下载文件后,我能做些什么来关闭套接字。请注意,我从中下载文件的所有 URL 都位于不同的服务器上。

【问题讨论】:

    标签: java apache-httpclient-4.x


    【解决方案1】:

    将连接释放回管理器并不能保证立即处理它。经理很可能会尝试保持连接处于活动状态。您在这里有两个选项 (1) 正如user2310289 正确指出的那样,您可能希望实现一个自定义连接,在连接释放时不加选择地关闭连接,或者 (2 (recommended)) 实现自定义驱逐在 HttpClient tutorial 中描述的一段时间不活动后驱逐持久连接的策略

    【讨论】:

      【解决方案2】:

      根据The HTTPClient webpage

      正确的做法是

      } finally {
        // Release the connection.
        method.releaseConnection();
      }  
      

      文档还提到,为了强制关闭连接,最简单的方法是覆盖 connectionManager,在您的情况下是 PoolingClientConnectionManager。

      如果您查看here 的代码,您可以看到您可以更改 releaseConnection 方法。具体更改第 255 行,以便在连接打开时将其关闭。

      【讨论】:

      • 所以我已经这样做了。但是在文档的某处它还说在释放连接后连接将返回到管理器但不会关闭。在我下载 5 个文件后的场景中,管理器将有 5 个连接指向 5 个不同的服务器。但是,现在当我想下载第 6 个文件时,池中将没有任何空闲连接来连接到第 6 个服务器,我将不得不等到客户端关闭连接(在我的情况下是连接超时=0)。我的想法正确吗?以及我应该怎么做才能防止这种情况发生。
      • 抱歉,我很困惑为什么您认为“释放连接”和“关闭连接”是不同的。 “释放”连接的原因是可以重新使用它。顺便说一句,“释放”连接的是客户端
      • 重新用于联系同一台服务器或其他服务器?我的意思是释放连接后,套接字是关闭还是保持活动状态?
      • 啊,那样的话你可以调用 getConnectionManager() 然后调用 closeIdleConnections(long idletime, TimeUnit tunit)
      • 但是为此我需要创建另一个线程对吗?有没有办法在不关闭空闲连接的情况下做到这一点。我的意思是我已经下载了文件并释放了连接,那为什么我不能在其他服务器上重用它呢?下载5个文件会卡住吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多