負載既沒有在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