如何使用PoolingHttpClientConnectionManager限制同一主机(setMaxPerRoute)的连接?

时间:2016-08-01 13:18:38

标签: java apache-httpclient-4.x

我使用 PoolingHttpClientConnectionManager 与以下服务并行发送多个GET / POST请求:

(1)http://localhost:8080/submit
(2)http://localhost:8080/query

两种服务都被大量使用,但第一项服务(1)具有更高的优先级。

我需要为service(1)设置 setMaxPerRoute ,以便它占用80%的可用连接。 剩余的20%限制将分配给具有更长超时的其余请求(包括服务(2))。这是我的代码:

    ...        
    PoolingHttpClientConnectionManager httpClientManager = 
                    new PoolingHttpClientConnectionManager();

            httpClientManager.setMaxTotal(10);

            httpClientManager.setDefaultMaxPerRoute(2);

            HttpHost httpHost = new HttpHost("http://localhost/submit",8080);
            HttpRoute submitRoute = new HttpRoute(httpHost);
            httpClientManager.setMaxPerRoute(submitRoute, 8);
    ...

问题是HttpHost显然不能区分路线。实际上,两个URL具有相同的主机(http://localhost:8080),但具有不同的请求页面。结果,两个服务都使用相同的资源。

有没有办法对同一主机实施这样的限制?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据我的同事的建议,我找到了解决方案。

我们需要控制最大连接数,以便在请求URL(1)时我们拥有最多20个连接的池,而其余类型的请求包括request(2)我们拥有最多2个连接的池。

可以通过创建两个不同的 HttpClient 对象来解决,每个对象都有自己的 PoolingHttpClientConnectionManager 。第一个管理器设置为setMaxTotal = 20,而第二个管理器设置为setMaxTotal = 2。

现在每个池对同一个域都有不同的限制。