1

我的 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();

我的问题是:

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

如何指定最大连接数?

我应该如何实现泽西客户端以重用开放连接?

4

1 回答 1

0

我不知道在网络应用程序级别限制泽西岛资源的方法。如果升级到 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 请求的毫秒数。
于 2013-06-21T16:12:51.533 回答