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

时间:2013-10-18 11:53:36

标签: java httpclient apache-httpclient-4.x solr4

背景:

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

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

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

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

    Invalid use of BasicClientConnManager: connection still allocated

  4. 问题:

    我正在使用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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

因此,您不必担心在构建客户端时传递连接管理器两次,只需要知道AIMDBackoffManager在其backOff和探测器实现中获取连接管理器的锁定,您可以在source中看到