Java http连接池在Jersey如何工作?

Java http连接池在Jersey如何工作?,java,jersey,jersey-2.0,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.je

这是我的密码

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;
    }
}
我有以下问题

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

  • 当执行以下代码时,会发生什么

    JerseyClient=JerseyClientBuilder.createClient(clientConfig)

  • 换句话说,为什么创建客户机是一项昂贵的操作?我甚至还没有提到url或请求

    很抱歉,我在这方面的知识薄弱。

    客户端
    实例很重 实例的初始化可能是一项昂贵的操作,因为实例是管理与服务器的底层通信基础结构的重量级对象

    您应该只创建少量实例,并在可能的情况下重用它们。缔约国声明如下:

    Client
    s是管理客户端通信基础结构的重型对象。初始化和处置
    客户端
    实例可能是一项相当昂贵的操作。因此,建议在应用程序中只构造少量的
    客户端
    实例<代码>客户端实例必须在处置前正确关闭,以避免资源泄漏

    使用ApacheConnectorProvider 默认情况下,Jersey中的传输层由提供。该支持通过在泽西岛实施。如果需要,可以替换默认连接器

    Jersey通过与Apache HTTP客户端集成。要使用它,请确保您具有以下依赖性:

    
    org.glassfish.jersey.connectors
    但是你没有在任何地方使用它。将以下行添加到代码中:

    clientConfig.property(ApacheClientProperties.CONNECTION\u管理器,connectionManager);
    connectorProvider(新的ApacheConnectorProvider());
    

    有关更多详细信息,请参阅。

    Hi I添加了建议的代码更改。根据文档,客户机必须关闭,但在多线程环境中,当每个线程访问同一个类实例(如上面的代码中所示)并且不建议在需要时创建新的客户机实例时,这怎么可能呢。那么,在这种情况下,我是否要调用response对象的close呢?在多线程环境中是否有更好的方法来处理此问题?请简要说明以供进一步参考:根据Jersey项目的开发人员,@user3184974,每次请求后需要关闭的是连接,而不是
    客户端
    实例。有关更多详细信息,请参阅。这也可能有帮助。