1

背景 :

  1. 我正在使用 HttpClient (SolrJ) 连接到 Solr 服务。不过,这个问题与 Solr 没有直接关系。

  2. 在进行负载测试时,我遇到了以下问题。

    原因:java.lang.IllegalStateException:BasicClientConnManager 的使用无效:连接仍然分配。

  3. SOF 答案 - 使用池连接管理器

    BasicClientConnManager 使用无效:连接仍然分配

问题 :

我正在使用PoolingHttpClientConnectionManager,如下面的代码所示。我希望使用AIMDBackoffManager来管理它,而不是手动限制连接大小。但是,我看到AIMDBackoffManager需要连接池作为其参数。

public static final PoolingClientConnectionManager poolingConnectionManager = new PoolingClientConnectionManager();

public static DefaultHttpClient getHttpClient(){

    DefaultHttpClient  httpClient = new DefaultHttpClient(poolingConnectionManager);
    httpClient.setBackoffManager(new AIMDBackoffManager(poolingConnectionManager));

 ...
 ...

}

我用谷歌搜索了一下,但我找不到任何关于BackoffManager. 所以,这就是我所做的,但我对将连接管理器两次传递给DefaultHttpClient. HttpClient或者考虑到我第一次将其传递给并且第二次将其传递给 ,我是否应该担心BackoffManager

我正在使用 httpclient-4.2.3

4

2 回答 2

1

我也冒险进入了这个深水区。我一直在研究如何使用 ServiceUnavailableRetryStrategy 在我的情况下似乎由于 BackoffManager 而失败。我的印象是这不是一个完整的功能,因为我无法通过谷歌搜索它的用法,而且 HttpClient 源代码中也没有太多内容。

于 2013-12-12T18:39:41.230 回答
0

AIMDBackoffManager 构造函数采用ConnPoolControl(连接管理器实现)。查看此界面,您会看到它仅返回池的特定于路由的统计信息,这是 BackoffManager 用来执行其任务的。

因此,您不必担心在构建客户端时两次传递连接管理器,只需注意 AIMDBackoffManager 在其 backOff 和探测实现中获取连接管理器的锁,您可以在源代码中看到。

于 2017-12-03T06:33:52.510 回答