Нужно ли явно закрывать как CloseableHttpClient, так и CloseableHttpResponse - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть следующий метод, который выдает запрос HTTP POST.

Возвращает CloseableHttpResponse, поэтому любой вызывающий его код может получить код состояния, тело ответа и т. Д.

Я пытаюсь понять, нужно ли закрывать оба:

  • CloseableHttpClient client
  • CloseableHttpResponse closeableHttpResponse

?Или закрытие одного, закрытие другого?

..
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;

public static CloseableHttpResponse post(final String restEndpoint, final String data, final Header[] headers) throws Exception {
    final URIBuilder uriBuilder = new URIBuilder(restEndpoint);
    final HttpPost httpPost = new HttpPost(uriBuilder.build());
    httpPost.setHeader("Accept", "application/json");
    httpPost.setHeader("Cache-Control", "no-cache, no-store");

    if (data != null) {
        httpPost.setEntity(new StringEntity(data));
    }

    if (headers != null) {
        for (Header header : headers) {
            httpPost.setHeader(header);
        }
    }

    final CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(createSSLFactory())
            .setSSLHostnameVerifier(new NoopHostnameVerifier())
            .build();

    final CloseableHttpResponse closeableHttpResponse = client.execute(httpPost);
    final int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
    logger.debug(Optional.empty(), statusCode, httpPost.toString());

    return closeableHttpResponse;
}

1 Ответ

1 голос
/ 24 сентября 2019

I думаю, CloseableHttpResponse необходимо будет закрывать вручную каждый отдельный запрос.

Есть несколько способов сделать это.

С попыткой /блок catch / finally:

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import java.io.IOException;

public class CloseableHttpClientWithTryCatchFinally {

    public static void main(String... args) throws Exception {

        URIBuilder uriBuilder = new URIBuilder("https://www.google.com/");

        HttpGet httpGet = new HttpGet(uriBuilder.build());

        CloseableHttpClient client = HttpClients.custom().build();

        CloseableHttpResponse response = null;

        try {
            response = client.execute(httpGet);

            response.getEntity().writeTo(System.out);

        } catch (IOException e) {

            System.out.println("Exception: " + e);
            e.printStackTrace();

        } finally {

            if (response != null) {
                response.close();
            }
        }
    }
}

Я думаю, что лучшим ответом будет использование оператора try-with-resources :

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import java.io.IOException;

public class CloseableHttpClientTryWithResources {

    public static void main(String... args) throws Exception {

        URIBuilder uriBuilder = new URIBuilder("https://www.google.com/");

        HttpGet httpGet = new HttpGet(uriBuilder.build());

        CloseableHttpClient client = HttpClients.custom().build();

        try (CloseableHttpResponse response = client.execute(httpGet)) {

            response.getEntity().writeTo(System.out);

        } catch (IOException e) {

            System.out.println("Exception: " + e);
            e.printStackTrace();
        }
    }
}

В общем, я имеюувиденные люди просто создают один CloseableHttpClient для своего приложения, а затем просто повторно используют этот экземпляр в своем приложении.Если вы собираетесь использовать один или несколько экземпляров снова и снова, то нет, я не думаю, что вам нужно их закрывать.Однако, если вы собираетесь создавать новые экземпляры CloseableHttpClient снова и снова, тогда да, вам нужно будет их закрыть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...