在多线程环境中使用 apache HttpClients 的最佳方式

Best way for apache HttpClients using in a multithreaded environment

我需要在服务器端创建一个服务来发送 HTTP 请求。它是这样工作的:

1. Client sends a request to the server
2. Server uses singleton service for calling 3rd-party API via HTTP.
3. API returns the response
4. Server process this response and return it to the client

这是一个同步过程。

我创建了服务:

public class ApacheHttpClient {

    private final static CloseableHttpClient client = HttpClients.createDefault();

    public String sendPost(String serverUrl, String body) {
        try {
            HttpPost httpPost = new HttpPost(serverUrl);
            httpPost.setEntity(new StringEntity(body));
           
            CloseableHttpResponse response = client.execute(httpPost);

            String responseAsString = EntityUtils.toString(response.getEntity());

            response.close();

            return responseAsString;
        } catch (IOException e) {
            throw new RestException(e);
        }
    }

ApacheHttpClient 在我的系统中是一个单例。 CloseableHttpClient client也是单例

问题 1:使用 CloseableHttpClient client 的一个实例是否正确,或者我应该为每个请求创建一个新实例? 问题二:什么时候关闭客户端? 问题3:这个客户端在一个时间段内只能处理2个连接。我应该使用遗嘱执行人吗?

  1. 将 HttpClient 实例用作每个不同 HTTP 服务的单例是正确的,并且符合 Apache HttpClient 最佳实践。不过,它应该 而不是 是静态的。

    http://hc.apache.org/httpcomponents-client-5.1.x/migration-guide/preparation.html

  2. 释放HTTP服务时应关闭HttpClient。在您的情况下,ApacheHttpClient 应该实现 Closeable 并在其 #close 方法中关闭 CloseableHttpClient 的内部实例。

  3. 您可能不应该这样做,但这实际上取决于您的应用程序处理请求执行的准确程度。