【问题标题】:Jersey Client opens too many ConnectionsJersey 客户端打开了太多的连接
【发布时间】:2013-06-20 08:32:48
【问题描述】:

我的 jersey rest api 和客户端遇到了一些问题。

这就是我在服务器端使用这些方法的方式:

@POST
@Path("/seed")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addSeed(Seed seed) throws InterruptedException {

    if (!Validator.isValidSeed(seed)) {
        return Response.status(400).entity("{\"message\":\"Please verify your JSON!\", \"stat\":\"failed\"}")
                .build();
    }
        save(seed);
        return Response.status(200).build();
}

如果我在 while(true) 循环中运行 Jersey 客户端,则会打开连接并且不会关闭。所以我遇到了一个问题,我打开了很多连接并且我的网络崩溃了。所以我不能再使用我的服务器了。连接关闭后,我可以连接到服务器。

这是一个客户:

    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);
    WebResource service = client.resource(getBaseURI()).path("api/seed");
    while (true) {
            ClientResponse cr = service.header("Content-Type", "application/json").post(ClientResponse.class, seed);
            System.out.println(cr);
            cr.close();

我的问题是:

我可以在服务器端做些什么来防止客户端打开新连接?

如何指定最大连接数?

我应该如何实现 jersey 客户端以重用打开的连接?

【问题讨论】:

  • 我使用 tomcat 6,我可以在 server.xml 中指定 maxThreads 的数量。但我不想更改 server.xml,有没有办法在资源或客户端中做到这一点?

标签: connection client jersey jax-rs


【解决方案1】:

我不知道在网络应用级别限制泽西岛资源的方法。如果您升级到 GlassFish EE,您可以使您的资源 EJB @Stateless @StatelessDeployment(maxInstances=16)

连接堆积可能是由于 Keep-Alive 设置造成的。在 Tomcat 6 中,您可以使用以下两种方式调整连接器:

  1. maxKeepAliveRequests,默认为 100。它是在服务器关闭连接之前可以流水线化的 HTTP 请求的最大数量。将此属性设置为 1 将禁用 HTTP/1.0 keep-alive,以及 HTTP/1.1 keep-alive 和流水线。将此设置为 -1 将允许无限量的流水线或保持活动 HTTP 请求。
  2. keepAliveTimeout,默认为 connectionTimeout,默认为 60k ms。它是此连接器在关闭连接之前等待另一个 HTTP 请求的毫秒数。

【讨论】:

  • 我们公司使用的是Tomcat 6,所以我无法更改服务器。正如我上面提到的,我无法调整 Tomcat 配置,因为在同一台服务器上运行着一些其他应用程序。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多