负载既没有在PoolingClientAsyncConnectionManager测试之后,我们发现,我们得到的结果不一致的时候,我们没有使用PoolingClientAsyncConnectionManager。除此之外,我们还跟踪了我们正在制作的Http调用的数量,以及已完成的Http调用的数量(通过取消(...),完成(...)或失败(...)。 ..)相关的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
}
});
}
}
当我想到更多关于它的,我不认为ThreadLocal的正常工作。使用HttpClient,execute方法是阻塞的,但是对于HttpAsyncClient,execute方法是非阻塞的,所以单个线程可能会调用多次执行,这可能会导致与多个线程调用在同一个HttpClient对象上执行相同的干扰。 – Tinclon 2012-08-14 20:10:20