背景:
我正在使用HttpClient(SolrJ)连接到Solr服务。但问题与Solr没有直接关系。
在进行负载测试时,我遇到了以下问题。
引起:java.lang.IllegalStateException:无效使用BasicClientConnManager:仍然分配了连接。
SOF答案 - 使用池连接管理器
Invalid use of BasicClientConnManager: connection still allocated
问题:
我正在使用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
答案 0 :(得分:1)
我也冒险进入这个深水区。我一直在研究如何使用ServiceUnavailableRetryStrategy,在我的情况下由于BackoffManager而失败。我有一个印象,这不是一个完成的功能,因为我不能谷歌它的用法,并且在HttpClient源代码中也没有太多。
答案 1 :(得分:0)
AIMDBackoffManager构造函数采用ConnPoolControl(连接管理器实现)。查看此界面,您将看到它只返回池的特定于路由的统计信息,这是BackoffManager用于执行其任务的信息。
因此,您不必担心在构建客户端时传递连接管理器两次,只需要知道AIMDBackoffManager在其backOff和探测器实现中获取连接管理器的锁定,您可以在source中看到