如何使用 HttpClient 进行多线程操作?

Posted

技术标签:

【中文标题】如何使用 HttpClient 进行多线程操作?【英文标题】:How to use HttpClient with multithreaded operation? 【发布时间】:2011-03-28 07:00:59 【问题描述】:

我要做一个应用程序,它在某个主机中执行登录 POST 请求,然后导航一些页面,查找并检索一些数据。 因为网站资源受会话保护,所以我必须先登录网站才能进行一些操作,例如获取或发布一些数据。 我的问题是因为 HttpClient 不是线程安全的,我怎样才能只创建一个 HttpClient 实例但线程可以安全地执行它? 请记住,底层连接必须先登录才能使用。

【问题讨论】:

【参考方案1】:

这是一个答案:http://pro-programmers.blogspot.com/2009/06/apache-httpclient-multi-threads.html

【讨论】:

我已经阅读了它,但这不是我想要的。在帖子中你建议 HttpClient 的版本是 3.x。我用的是4.x,需要有状态的连接才能使用,不是无状态的。如果建议无状态的ThreadSafeClientConnManager,但是如果需要有状态呢? 好文章progrnotes.blogspot.com/2013/10/…【参考方案2】:

您可以通过指定线程安全客户端管理器来使 HttpClient 线程安全。

API:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager.html

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DefaultHttpClient.html#DefaultHttpClient%28org.apache.http.conn.ClientConnectionManager%29

例如:http://thinkandroid.wordpress.com/2009/12/31/creating-an-http-client-example/

【讨论】:

是的,我可以。据我所知,HttpClient使用单个连接。如果我使用 ThreadSafeClientConnManager,它可以保存我的第一个登录会话吗? 是的,状态与连接无关。例如。如果请求 1 设置了一个 cookie,那么使用 Thread Safe Conn 管理器的请求 2(对于同一域)也是可见的。 好的,非常感谢!我会再试一次。 请记住,ThreadSafeClientConnManager 自 4.2 版起已弃用,请改用 PoolingClientConnectionManager。 参见***.com/a/14762579/923560,了解如何在 4.2 版中设置 PoolingClientConnectionManager 的示例

以上是关于如何使用 HttpClient 进行多线程操作?的主要内容,如果未能解决你的问题,请参考以下文章

spring如何解决多线程的数据操作

Httpclient

我的多线程 HttpClient 有啥问题吗?

使用Apache HttpClient实现多线程下载的小例子

HttpClient在多线程环境下踩坑总结

记录一个使用HttpClient过程中的一个bug