【问题标题】:Do I need to close my HttpClient if I am reusing the connectionPool in it (java)如果我拒绝其中的连接池,我是否需要关闭我的 HttpClient (java)
【发布时间】:2019-11-21 21:31:14
【问题描述】:

这是一个示例程序。

public class Foobar {

     private HttpClient;

     public Foobar(RequestConfig config, PoolingHttpClientConnectionManager, connManager) {
return HttpClients.custom()
                .setDefaultRequestConfig(config)
                .setConnectionManager(connManager)
                .build();
}

public Foobarrr execute() {
HttpPost httpPost = new HttpPost("/blah");
HttpResponse response;
        try {
            response = httpClient.execute(httpPost);
            else if (response.getEntity().getContent() != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                return mapper.readValue(response.getEntity().getContent(), Foobarrr.class);
            }
        catch(Exception ex){
         throw new RuntimeException(ex);


}

在上述情况下,客户端只创建一次,但可以重复使用。 我在互联网上看到另一个版本的代码,其中 httpClient 在 try-catch 中关闭。这不是一件昂贵的事情吗,或者与上述方式相比,这有什么优势

public void executeWithPooledUsingHttpClientBuilder() throws Exception {
    try (CloseableHttpClient httpClient = HttpClients.custom()
                                                     .setMaxConnTotal(100)
                                                     .setMaxConnPerRoute(20)
                                                     .build()) {
        final HttpGet httpGet = new HttpGet(GET_URL);
        try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
            EntityUtils.consumeQuietly(response.getEntity());
        }
    }

【问题讨论】:

    标签: java httpurlconnection connection-pooling apache-httpclient-4.x


    【解决方案1】:

    1. 最新版本的代码绝对没问题。 它是按照 try-with-resources 声明

    try-with-resources 语句是一个 try 语句,它声明一个 或更多资源。资源是必须在之后关闭的对象 该程序已完成。 try-with-resources 语句 确保每个资源在语句结束时关闭。任何 实现 java.lang.AutoCloseable 的对象,它包括所有 实现 java.io.Closeable 的对象可以用作资源。

    2.这不会对性能造成影响,因为您已经在设置连接管理器

    public Foobar(RequestConfig config, PoolingHttpClientConnectionManager connManager) {
    return HttpClients.custom()
                    .setDefaultRequestConfig(config)
                    .setConnectionManager(connManager)
                    .build();
    

    您的连接管理器将拥有一个连接池。 因此关闭并再次请求将不是问题。

    【讨论】:

    • HttpClient 在我展示的第二个示例中已关闭。关闭 httpClient,也关闭 connectionManager。我知道自动关闭的工作原理
    【解决方案2】:

    通常强烈建议在不再需要 HttpClient 实例时关闭它们。

    然而,一个人可以使用HttpClientBuilder#setConnectionManagerShared 来通知构建器它不应该在关闭时连接HttpClient 来关闭其连接管理器。

    【讨论】:

    • 这个博客让我感到困惑..它说 HttpClient 应该在 Web 应用程序的每个生命周期中创建一次。我的应用程序是一个网络服务,所以总是需要客户端。 aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
    • 那要不要重用HttpClient?
    • 是的,如果它将成为该博客中提到的性能约束
    • Apache HttpClient性能优化的第一条规则是重用HttpClient实例
    • 这次请仔细阅读我的回答。一旦不再使用 HttpClient 实例,即使在重新使用底层连接池时,一个必须关闭它们。这并不意味着应该一直创建和关闭这些实例。
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2022-01-05
    • 2017-06-21
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多