我试图在 https 服务上重复发出 10 个请求,我能够做到这一点,但我为此使用了 10 个 tcp 连接。 我想重用在开始时为 10 个请求创建的相同 tcp 连接,如何在下面的代码中执行此操作
这里的客户端是javax.ws.rs.client
java代码:
static SslConfigurator sslConfig = SslConfigurator
.newInstance()
.securityProtocol("TLS")
.keyStoreFile("/path")
.keyStorePassword("password")
.keyStoreType("JKS")
.trustStoreFile("/path");
static SSLContext sslCtx = sslConfig.createSSLContext();
static Client client = ClientBuilder.newBuilder().sslContext(sslCtx).build();
for (i = 0; i < 10; i++) {
Response response = client.target(target).path(path)
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(jsonRequest.toString(), MediaType.APPLICATION_JSON));
}
最佳答案
有一篇关于它的好文章:Setting up jersey client 2.0 to use httpclient, timeouts, and max connections但实际上现在已经过时了。当前 Jersey 客户的示例:
static PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
static Client client;
static{
connectionManager.setMaxTotal(100);
connectionManager.setDefaultMaxPerRoute(10);
//you can provide per route settings
//connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost("localhost")), 40);
SslConfigurator sslConfig = SslConfigurator.newInstance()
.securityProtocol("TLS")
.keyStoreFile("/path")
.keyStorePassword("password")
.keyStoreType("JKS")
.trustStoreFile("/path");
ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
clientConfig.connectorProvider(new ApacheConnectorProvider());
client = ClientBuilder.newBuilder().withConfig(clientConfig).sslContext(sslConfig.createSSLContext()).build();
}
此外,您还应该调用 response.close();
将连接标记为空闲。
默认情况下,您使用BasicHttpClientConnectionManager
。它有以下通知:此连接管理器将努力为具有相同 HttpRoute 路由的后续请求重用该连接。但是,如果持久连接的路由与连接请求的路由不匹配,它将关闭现有连接并为给定路由打开它
因此,在简单的情况下,默认情况下会重用连接。
关于java - 如何在javax.ws.rs.client中为客户端重用java中的tcp session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651563/