如何在多线程操作中使用 HttpAsyncClient?

Tin*_*lon 5 java multithreading apache-httpclient-4.x

与这个问题密切相关:How to use HttpClient with multithreaded operation? ,我想知道 apache HttpAsyncClient 是否是线程安全的,或者它是否也需要使用 MultiThreadedHttpConnectionManager 或 ThreadSafeClientConnManager。

如果确实需要这样的连接管理器,异步库中是否存在?

我能够在异步库中找到 PoolingClientAsyncConnectionManager,但我不确定这是否是我需要的。

或者,我正在考虑使用 ThreadLocal 为每个线程创建一个 HttpAsyncClient 对象。

请注意,与我之前引用的问题不同,我需要状态在会话之间保持独立,即使多个会话访问同一个域。如果Cookie在会话1套,饼干应该不会是会议2。出于这个原因可见,我也考虑每一个请求创建一个全新的HttpAsyncClient对象,但我得到的印象应该有更好的办法.

谢谢。

Tin*_*lon 1

在使用和不使用 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
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)