我有一个拥有AsyncHttpClient的Akka actor。这个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
}
}
);
问题是请求永远不会放在客户端队列中,并且所有处理都像配置无关紧要。为什么这不能正常工作?
答案 0 :(得分:2)
来自维护者:
setMaxConnectionsPerHost
仅限制可以对给定主机开放的连接数。对于可能需要连接而没有可用连接的请求,没有内置的排队机制。
所以基本上,这是一个很难的限制。此外,在之前的库版本中,我相信1.9.10,代码没有正确使用maximumConnectionsPerHost
字段来限制每个主机的并发连接数。相反,有一个错误,客户端只查看maximumConnectionsTotal
字段。