【发布时间】:2023-03-06 11:54:01
【问题描述】:
我试图了解在实现中使用 Apache HttpClient 管理 http 连接的最佳方法(不是我的)。我认为现在实现它的方式是一种浪费,但是由于我对这个库不是很熟悉,所以我想确认一下我的想法。
考虑这种情况:
- 我在tomcat中有一个webapp,意思是多线程环境。
- 我需要从 Rest 类访问 Rest WebService。对我的应用的每个请求都会创建一个新的 Rest 类实例,以便调用我需要的服务。
选项 1(当前已实现):Rest 类实例化一个新的 PoolingHttpClientConnectionManager 并发出请求。
就个人而言,我认为这完全是浪费。一次只有一个线程访问管理器的实例。因此,这种方法并没有真正的好处。这实际上是最糟糕的,因为我假设创建这个经理可能很昂贵(?)。因此,实际上我们最终会创建多个 PoolingHttpClientConnectionManager,每个线程一个(每个请求一个)。
选项 2:Rest 类只能将一个 PoolingHttpClientConnectionManager 实例化为一种单例。
然后来自 tomcat 的每个线程将重用相同的连接管理器,并且每个线程只会创建新的 httpClient。 我认为这可以从池中获得所有好处,例如控制连接数量和重用。但我不知道这对管理器是否有用(我的猜测是应该没问题,因为这个连接管理器的全部目的是在多线程环境中工作)。
选项 3:Rest 类可以实例化一个 BasicHttpClientConnectionManager 的新实例。
我试过这个并且工作得很好。这意味着每个线程都有自己的单个连接管理器。即使这个管理器只有一个连接,因为我们每个线程都有一个管理器,所以我们实现了并行执行。
我认为这种方法的缺点是没有限制。因此,如果我的应用收到太多请求,我们每次都会创建一个新管理器,而且我们不会重复使用到同一路由的连接。
如果您能就此事给我任何想法,我将不胜感激。 我见过很多例子,但总是来自主函数的简单例子,并明确地创建线程。没有看到tomcat等应用服务器的例子。
【问题讨论】:
-
选项 2。您希望尽可能广泛地共享连接。多个池只是浪费连接,因为空闲的不共享。
标签: java apache-httpclient-4.x