http 连接池如何在泽西岛工作?

use*_*974 3 java jersey jersey-2.0

这是我的代码。

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.JerseyClient;
import org.glassfish.jersey.client.JerseyClientBuilder;

public class Jersey2HttpClient {

    private static class InstanceHolder {
        private static final JerseyClient INSTANCE = createClient();

        private static JerseyClient createClient() {
            ClientConfig clientConfig = new ClientConfig();
            clientConfig.property(ClientProperties.READ_TIMEOUT, 20000);
            clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 20000);
            PoolingHttpClientConnectionManager connectionManager =
                new PoolingHttpClientConnectionManager();
            connectionManager.setMaxTotal(200);
            connectionManager.setDefaultMaxPerRoute(50);
            clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
            clientConfig.connectorProvider(new ApacheConnectorProvider());

            JerseyClient client = JerseyClientBuilder.createClient(clientConfig);
            client.register(RequestLogger.requestLoggingFilter);
            return client;
        }
    }

    public static JerseyClient getInstance() {
        return InstanceHolder.INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下问题。

  1. 如果每次创建“连接池对象”时都会将相同的客户端(通过 getInstance())返回到调用线程?似乎相同的对象(客户端)用于连接。

  2. 执行以下代码时到底发生了什么。

    JerseyClient 客户端 = JerseyClientBuilder.createClient(clientConfig);

换句话说,为什么创建客户端是一项昂贵的操作?我什至还没有提到网址或请求。

很抱歉我对这个主题的知识薄弱。

cas*_*lin 9

Client 实例是重量级的

Client实例的初始化可能是一项昂贵的操作,因为Clients 是管理与服务器的底层通信基础设施的重量级对象。

您应该只创建少量Client实例并在可能的情况下重用它们。该文件规定如下:

Clients 是管理客户端通信基础设施的重量级对象。Client实例的初始化和处置可能是一个相当昂贵的操作。因此,建议Client在应用程序中仅构建少量实例。Client实例在处置前必须正确关闭,以避免资源泄漏。

使用 ApacheConnectorProvider

默认情况下, Jersey 中的传输层由HttpURLConnection. 这种支持在泽西岛通过HttpUrlConnectorProvider. 如果需要,您可以替换默认连接器。

Jersey 通过ApacheConnectorProvider. 要使用它,请确保您具有以下依赖项:

<dependency>
    <groupId>org.glassfish.jersey.connectors</groupId>
    <artifactId>jersey-apache-connector</artifactId>
    <version>2.23.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您已经实例化了 aPoolingHttpClientConnectionManager但您没有在任何地方使用它。将以下行添加到您的代码中:

clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
clientConfig.connectorProvider(new ApacheConnectorProvider());
Run Code Online (Sandbox Code Playgroud)

有关其他详细信息,请参阅有关连接器的 Jersey 文档