3

我有一个拥有 AsyncHttpClient 的 Akka 演员。这个actor必须处理很多异步请求。因为我的系统无法同时处理数千个请求,所以我需要限制并发请求的数量。

现在,我正在这样做:

AsyncHttpClientConfig config = new AsyncHttpClientConfig.Builder().setAllowPoolingConnection(true)
                                                                  .addRequestFilter(new ThrottleRequestFilter(32))
                                                                  .setMaximumConnectionsPerHost(16)
                                                                  .setMaxRequestRetry(5)
                                                                  .build();
final AsyncHttpClient httpClient = new AsyncHttpClient(new NettyAsyncHttpProvider(config));

当我的演员收到消息时,我使用这样的客户端:

Future<Integer> f = httpClient.prepareGet(url).execute(
   new AsyncCompletionHandler<Integer>() {
      @Override
      public Integer onCompleted(Response response) throws Exception {
         // handle successful request
      }

      @Override
      public void onThrowable(Throwable t){
         // handle failed request
      }
   }
);

问题是请求永远不会放在客户端队列中,并且都像配置无关紧要一样进行处理。为什么这不能正常工作?

4

1 回答 1

2

来自维护者:

setMaxConnectionsPerHost仅限制可以对给定主机打开的连接数。对于可能需要连接而没有可用连接的请求,没有内置的排队机制。

所以基本上,这是一个硬限制。此外,我相信在 1.9.10 之前的库版本中,maximumConnectionsPerHost代码没有正确利用该字段来限制每个主机的并发连接数。相反,有一个错误,客户端只查看maximumConnectionsTotal字段。

链接到 GitHub 上引用的问题

于 2016-05-16T18:02:08.967 回答