在使用和不使用 PoolingClientAsyncConnectionManager 进行负载测试后,我们发现在不使用 PoolingClientAsyncConnectionManager 时得到的结果不一致。
除其他外,我们跟踪了我们进行的 Http 调用的数量,以及已完成的 Http 调用的数量(通过 cancelled(...)、completed(...) 或 failed(...) 函数)相关的 FutureCallback)。如果没有 PoolingClientAsyncConnectionManager,并且在重负载下,这两个数字有时不匹配,这使我们相信在某个地方,某些连接正在踩踏来自其他线程的连接信息(只是猜测)。
无论哪种方式,使用 PoolingClientAsyncConnectionManager,数字总是匹配的,并且负载测试都成功了,所以我们肯定会使用它。
我们使用的最终代码如下所示:
public class RequestProcessor {
private RequestProcessor instance = new RequestProcessor();
private PoolingClientAsyncConnectionManager pcm = null;
private HttpAsyncClient httpAsyncClient = null;
private RequestProcessor() {
// Initialize the PoolingClientAsyncConnectionManager, and the HttpAsyncClient
}
public void process(...) {
this.httpAsyncClient.execute(httpMethod,
new BasicHttpContext(), // Use a separate HttpContext for each request so information is not shared between requests
new FutureCallback<HttpResponse>() {
@Override
public void cancelled() {
// Do stuff
}
@Override
public void completed(HttpResponse httpResponse) {
// Do stuff
}
@Override
public void failed(Exception e) {
// Do stuff
}
});
}
}