我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTTP 响应。我想使用连接池来提高性能,但我无法找到合适的方法来做到这一点。
我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTTP 响应。下面是一个代码示例,说明了如何设置连接管理器并使用它来获取 CloseableHttpClient 的实例:
// Setting up the connection manager
static PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
// Getting the CloseableHttpClient using the same connection manager
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
但是,在使用httpClient然后关闭它之后,我在尝试从connectionManager获取新的httpClient时遇到以下错误:
java.lang.IllegalStateException: Connection pool shut down
经过调查,我发现关闭 CloseableHttpClient 也会关闭连接管理器,从而导致此问题。
我了解在获取 httpClient 时建议使用连接池。然而,当前的行为提出了一个问题:如果关闭 httpClient 也会关闭连接管理器,我们如何重用相同的连接管理器来获取 httpClient?此外,如果我们不能重用相同的连接管理器,那么连接池如何有效地工作?
不要关闭
CloseableHttpClient
。它本身没有任何声明的资源,所有资源都通过连接管理器。
或者,在构建器上调用
setConnectionManagerShared(true)
。来自其 API 文档:
定义连接管理器由多个客户端实例共享。
如果连接管理器是共享的,则其生命周期预计由调用者管理,并且如果客户端关闭,它不会被关闭。