2013-10-18 59 views
1

背景:这是使用AIMDBackoffManager实例化HttpClient的正确方法吗?

  1. 我使用的HttpClient(SolrJ)连接到Solr的服务。但问题与Solr没有直接关系。

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

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

  3. 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)); 

... 
... 

}

我GOOGLE了公平一点,但我无法找到的BackoffManager使用任何的例子。所以,这就是我所做的,但我并不兴奋将连接管理器两次传递给DefaultHttpClient。或者我不应该担心考虑到我第一次将它传递给HttpClient并且第二次将它传递给BackoffManager

我使用的HttpClient-4.2.3

回答

1

我涉足这个深水为好。我一直在研究如何使用ServiceUnavailableRetryStrategy,这在我的情况下似乎由于BackoffManager而失败。我有一个印象,这不是一个完整的功能,因为我不能谷歌它的使用,也没有太多的HttpClient源代码。

+0

同意@Peter。网上没有太多的帮助。 –

+0

该功能的原始贡献者从来没有完全完成并记录它。请参阅https://issues.apache.org/jira/browse/HTTPCLIENT-1101。我们会很乐意把PR加以改进。 – oleg

0

AIMDBackoffManager构造函数需要ConnPoolControl(连接管理器实现)。看看这个接口,你会看到它只返回池的路由特定统计信息,这是BackoffManager用来执行其任务的。

因此,在构建客户端时,您不应该担心连接管理器传递两次,请注意AIMDBackoffManager获取连接管理器的backOff和probe实现上的锁定,您可以在source中看到该锁定。

相关问题