当前位置: 首页 > 面试题库 >

在多线程环境中使用HttpClient的最佳实践

公孙宏远
2023-03-14
问题内容

一段时间以来,我一直在多线程环境中使用HttpClient。对于每个线程,当它启动连接时,它将创建一个全新的HttpClient实例。

最近,我发现使用这种方法可能导致用户打开太多端口,并且大多数连接处于TIME_WAIT状态。

http://www.opensubscriber.com/message/commons-httpclient-
dev@jakarta.apache.org/86045.html

因此,不是每个线程都这样做:

HttpClient c = new HttpClient();
try {
    c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
}

我们计划拥有:

[方法A]

// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());

try {
    global_c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
}

在正常情况下,将由50
++个线程并发访问global_c。我想知道,这会造成性能问题吗?MultiThreadedHttpConnectionManager是否使用无锁机制来实现其线程安全策略?

如果10个线程正在使用global_c,其他40个线程是否将被锁定?

还是在每个线程中创建一个HttpClient实例,但显式释放连接管理器会更好?

[方法B]

MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
      c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
    connman.shutdown();
}

connman.shutdown()是否会遇到性能问题?

对于使用50 ++线程的应用程序,我能否知道哪种方法(A或B)更好?


问题答案:

httpclient开发人员社区推荐方法A。

请参阅http://www.mail-archive.com/httpclient-
users@hc.apache.org/msg02455.html
了解更多详细信息。



 类似资料:
  • 问题内容: 我在应用程序中使用Redis,既用于Sidekiq队列,也用于模型缓存。 考虑到将要在Redis上使用的模型将同时从我的Web应用程序(通过Puma运行)和Sidekiq内部的后台作业中被调用,使模型具有Redis连接的最佳方法是什么? 我目前正在初始化程序中执行此操作: 然后在整个代码中简单地使用/ (和类似的代码)… 据我了解,这应该是线程安全的,因为Redis客户端一次只能使用M

  • 我是新的Docker,希望在空气间隙的环境中使用它。我知道我可以在我的独立系统中建立我自己的存储库,但是我不知道如何将我需要的许多docker映像从docker集线器放到环境中。如果我能把它们下载到.zip或.tgz存档中,那就太好了,但没有办法从集线器上做到这一点。我不能在孤立的环境之外使用Docker。我可能可以在我的空气间隙环境之外使用git,但是获取.zip存档会更好。关于如何开始的建议将

  • 我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是注释。但我无法执行插入操作,导致出现以下异常。 异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.Native

  • 关于Spring WebClient我有一个问题 在我的应用程序中,我需要做许多类似的API调用,有时我需要更改调用中的头(身份验证令牌)。所以问题来了,在这两个选择中,什么更好: > 为所有传入的MyService.class请求创建一个WebClient,方法是将其设置为字段,如下代码所示: 谢谢你。

  • 我的程序使用ZMQ进行通信。也就是说,服务器(C、linux)创建一个XPUB套接字,然后在一个线程中读取它,在另一个线程中发布数据(写入)。 客户端(java、jzmq、linux)创建一个SUB套接字,并订阅使用它。 一段时间后,服务器端在读取线程中接收SIGABRT。 什么可能是问题的根源?在不同的线程中读/写或创建XPUB/SUB对? 如果问题是在多线程中,那么使用XPUB套接字的正确范例

  • 问题内容: 我正在开发一个项目,在该项目中,我需要对正在运行的服务器进行HTTP URL调用,该服务器将响应作为JSON字符串返回。 下面是我的主要代码,它使用和- 下面是我的类,它实现接口并使用… 现在我有下面的代码在另一大类它调用的方法类顺序- 所以我的问题是在这里应该是静态的,就像我正确看到的一样,我正在为每个请求重新创建整个连接池,而我猜这不是正确的方法。 注意: 如果我将RestTemp