HttpClient,ConnectionManager和奇怪的池限制

时间:2015-02-12 12:49:14

标签: java httpclient pool

我的WebApp使用AWS S3服务作为一堆文件的存储。当请求进来时,正在使用Jets3t库从S3获取适当的文件,该库使用ASF HttpClient。问题是HttpClient连接管理器使用一些奇怪的池概念,强制设置每个路由的最大连接数限制和一般的最大连接数。我习惯于将其大小调整为传入需求,但它在HttpClient中并没有这样做。因此,当达到池限制时,请求将保持不变,直到连接空闲为止。这在某种程度上默默地降低了我的WebApp的性能(S3服务远离饱和度)。

我无法以任何方式控制来到我的WebApp的大量请求,因此任何努力提出合理的最大连接限制都是徒劳的。即使当某个值对当前负载可能正常工作时,它也会在一些快速变化发生时失败(例如网站被搜索引擎抓取)。

所以这是我的问题:

  1. 是否有任何(可能是第三方)HttpClient的连接管理器没有执行此类限制?

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

  3. 如果有人想提出建议,我已经尝试为每个请求线程分别设置库实例(以及HttpClient)。它工作得很好,虽然我猜它会消耗更多的资源。如果克服最大连接限制的所有努力都失败,我可能会使用这种方法。

1 个答案:

答案 0 :(得分:0)

org.apache.http.impl.conn.PoolingHttpClientConnectionManager实现了org.apache.http.pool.ConnPoolControl接口,该接口提供了以下用于获取当前连接池统计信息的方法:

  • PoolStats getTotalStats()
  • PoolStats getStats(final T route)

您可以构造传递给用于构建PoolingHttpClientConnectionManager的{​​{1}}的{​​{1}}实例,因此您可以随时参考该实例以查询统计信息。

(可选)您可以创建org.apache.http.impl.client.HttpClientBuilder的子目录来记录统计信息;例如,在HttpClient时间(但可能仅在第n次通话之后)。