这是我的代码。
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);
换句话说,为什么创建客户端是一项昂贵的操作?我还没有提到网址或请求。
很抱歉,我对这个问题知之甚少。
答案 0 :(得分:4)
Client
个实例是重量级的 Client
实例的初始化可能是一项昂贵的操作,因为Client
是重量级对象,可以管理服务器的底层通信基础设施。
您应该只创建少量Client
个实例,并在可能的情况下重复使用它们。 documentation声明如下:
Client
是管理客户端通信基础设施的重量级对象。初始化以及Client
实例的处置可能是相当昂贵的操作。因此,建议在应用程序中仅构造少量Client
个实例。处置之前必须正确关闭Client
个实例以避免资源泄漏。
ApacheConnectorProvider
默认情况下,Jersey中的传输层由HttpURLConnection
提供。此支持在泽西岛通过HttpUrlConnectorProvider
实施。如果需要,可以替换默认连接器。
Jersey通过ApacheConnectorProvider
与Apache HTTP Client集成。要使用它,请确保您具有以下依赖性:
<dependency>
<groupId>org.glassfish.jersey.connectors</groupId>
<artifactId>jersey-apache-connector</artifactId>
<version>2.23.2</version>
</dependency>
在您的代码中,您已实例化PoolingHttpClientConnectionManager
,但您没有在任何地方使用它。将以下行添加到您的代码中:
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
clientConfig.connectorProvider(new ApacheConnectorProvider());
有关其他详细信息,请参阅Jersey documentation about connectors。