java - 如何在javax.ws.rs.client中为客户端重用java中的tcp session

标签 java spring web-services tcp

我试图在 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/

相关文章:

c# - 是否有与 C# 中的 Scanner 类等效的字符串?

java - writeTo PipedOutputStream 只是挂起

java - 使用响应编写图像 Sprite

java - Spring 支持 MIME 类型 "multipart/byteranges"

java - 在Java中通过restTemplate从rest webservice获取垃圾值

java - getter 是否应该返回对象实例的副本以避免副作用?

java - Hibernate异常: No Hibernate Session bound to thread

java - Spring Oauth2 隐式流程

ruby - 发布/订阅 REST-HTTP 简单协议(protocol) Web 服务架构?

java - Spring 安全 : Cannot call sendRedirect() after the response has been committed