gpt4 book ai didi

java - 如何使用 HttpAsyncClient 进行多线程操作?

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:49 26 4
gpt4 key购买 nike

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

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

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

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

请注意,与我之前提到的问题不同,我需要状态在 session 之间独立,即使多个 session 访问同一个域也是如此。如果在 session 1 中设置了 cookie,则该 cookie 应该对 session 2 可见。出于这个原因,我还考虑过为每个请求创建一个全新的 HttpAsyncClient 对象,尽管我得到了印象中应该有更好的方法。

谢谢。

最佳答案

您提到“跨 session 独立”。如果这仅意味着 cookie,那么我会认为创建您自己的 CookieStore,当您的每个线程使用 HttpClient 时,它会被清除就足够了。

我会使用 ThreadLocal 创建每线程客户端,不使用共享连接管理器,然后主动清除 cookie。这个答案对清除 cookie 很有用:

Android HttpClient persistent cookies

类似下面的代码会起作用。我已经覆盖了 ThreadLocal.get() 方法来调用 clear() 以防每个请求都是独立的。您还可以在 execute(...) 方法中调用 clear。

private static final ThreadLocal<ClientContext> localHttpContext = 
new ThreadLocal<ClientContext> () {
@Override
protected ClientContext initialValue() {
return new ClientContext();
}
@Override
public ClientContext get() {
ClientContext clientContext = super.get();
// could do this to clear the context before usage by the thread
clientContext.clear();
return clientContext;
}
};
...

ClientContext clientContext = localHttpContext.get();
// if this wasn't in the get method above
// clientContext.clear();
HttpGet httpGet = new HttpGet("http://www.google.com/");
HttpResponse response = clientContext.execute(httpGet);
...

private static class ClientContext {
final HttpClient httpClient = new DefaultHttpClient();
final CookieStore cookieStore = new BasicCookieStore();
final HttpContext localContext = new BasicHttpContext();
public ClientContext() {
// bind cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
}
public HttpResponse execute(HttpUriRequest request) {
// in case you want each execute to be indepedent
// clientContext.clear();
return httpClient.execute(request, httpContext);
}
public void clear() {
cookieStore.clear();
}
}

关于java - 如何使用 HttpAsyncClient 进行多线程操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com