在 HttpClient4 中使用 PoolingHttpClientConnectionManager 的正确方法出现 java.lang.IllegalStateException: 连接池关闭

问题描述 投票:0回答:1

我正在 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?此外,如果我们不能重用相同的连接管理器,那么连接池如何有效地工作?

java apache-httpclient-4.x
1个回答
2
投票

不要关闭

CloseableHttpClient
。它本身没有任何声明的资源,所有资源都通过连接管理器。

或者,在构建器上调用

setConnectionManagerShared(true)
。来自其 API 文档:

定义连接管理器由多个客户端实例共享。

如果连接管理器是共享的,则其生命周期预计由调用者管理,并且如果客户端关闭,它不会被关闭。

© www.soinside.com 2019 - 2024. All rights reserved.