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对象,但我得到的印象应该有更好的办法.
谢谢。
在使用和不使用 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)
| 归档时间: |
|
| 查看次数: |
8116 次 |
| 最近记录: |