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

时间:2015-09-18 12:01:15

标签: java spring web-services tcp

我试图在https服务上重复发出10个请求,我能够这样做,但我正在使用10个tcp连接。 我想重用为10个请求启动时创建的相同tcp连接,如何为下面的代码

执行此操作

这里的客户端是javax.ws.rs.client

java代码:

.carousel-indicators li, .carousel-indicators li.active {
  margin: 0px 7px !important;
}

2 个答案:

答案 0 :(得分:2)

关于它的文章很好:Setting up jersey client 2.0 to use httpclient, timeouts, and max connections但实际上它已经过时了。当前泽西岛客户的样本:

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路由的后续请求重用连接。但是,如果持久连接的路由与连接请求的路由不匹配,它将关闭现有连接并为给定路由打开

因此,在简单的情况下,默认情况下会重复使用连接。

答案 1 :(得分:1)

猜猜,但你可以试试这个:

Request req =  (Request) client.target(target).path(path).request(MediaType.APPLICATION_JSON);
for (i = 0; i < 10; i++ {
  Response response = req.post(
    Entity.entity(jsonRequest.toString(), MediaType.APPLICATION_JSON));
}