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;
}
}
我有以下问题
客户端
实例很重
实例的初始化可能是一项昂贵的操作,因为实例是管理与服务器的底层通信基础结构的重量级对象
您应该只创建少量实例,并在可能的情况下重用它们。缔约国声明如下:
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,每次请求后需要关闭的是连接,而不是客户端
实例。有关更多详细信息,请参阅。这也可能有帮助。