java - HttpClient、ConnectionManager 和奇怪的池限制

标签 java httpclient pool

我的 WebApp 使用 AWS S3 服务作为一堆文件的存储。当收到请求时,将使用 Jets3t 库从 S3 获取适当的文件,该库在底层使用 ASF HttpClient。问题在于 HttpClient 连接管理器使用一些奇怪的池概念,强制设置每个路由的最大连接数和一般最大连接数的限制。我习惯于根据传入需求调整其大小,但在 HttpClient 中却行不通。因此,当达到池限制时,请求将被搁置,直到连接空闲为止。这不知何故默默地降低了我的 WebApp 的性能(S3 服务远未饱和)。

我无法以任何方式控制传入我的 WebApp 的请求数量,因此任何想出合理的最大连接限制的努力都是徒劳的。即使某些值可能适合当前负载,但当出现一些快速变化时(例如,搜索引擎正在抓取网站),它也会失败。

这是我的问题:

  1. 是否有任何(可能是第三方)HttpClient 连接管理器不强制实现此类限制?

  2. 如果它不存在,我可以以某种方式让连接管理器报告连接池匮乏吗?如果根本没有希望,我想每次在日志中看到一些消息时调整最大连接限制。

如果有人想建议它,我尝试为每个请求线程创建单独的库实例(以及 HttpClient)。它工作得很好,尽管我猜它会消耗更多资源。如果克服最大连接限制的所有努力都失败,我可能会使用这种方法。

最佳答案

org.apache.http.impl.conn.PoolingHttpClientConnectionManager 实现了 org.apache.http.pool.ConnPoolControl 接口(interface),它提供了这些获取当前连接的方法池统计:

  • PoolStats getTotalStats()
  • PoolStats getStats(最终 T 路线)

您可以构造传递给用于构建 HttpClientorg.apache.http.impl.client.HttpClientBuilderPoolingHttpClientConnectionManager 实例,因此您可以随时引用该实例来查询统计信息。

(可选)您可以创建一个用于记录统计信息的 PoolingHttpClientConnectionManager 子类;例如,在 requestConnection() 时间(但可能仅在每第 n 次调用之后)。

关于java - HttpClient、ConnectionManager 和奇怪的池限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477921/

相关文章:

java - Java 中 String flyweight 实现的最佳替代方案

Java 字符串文字池

java - Sonar WS : How to get the total unresolved bugs count using Sonar Webservice

java - 如何替换 String s = "33 6.33";在 Java 中为 "336.33"

java - Apache HTTPClient 抛出 java.net.SocketException : Connection reset for many domains

java - 如何使用 Web 客户端获取经过数据验证的页面

java - 为什么 Guice 在 main 中从 UncaughtExceptionHandler 抛出 $ComputationException?

java - Apache Camel如何以 "body"格式提交正文

java - 我如何从 HttpClient 获取 Bearer Token?

Python 将变量传递给多处理池