gpt4 book ai didi

java - 为什么 Jetty 9.x 中的 ServletTester 这么慢?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:47:25 25 4
gpt4 key购买 nike

Jetty 的 ServletTester 对于测试 Servlet 应用非常有用。我之前使用过 Jetty 6 的 ServletTester,它运行良好。

例如:

jetty 6.x

pom.xml

<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-servlet-tester</artifactId>
<version>6.1.26</version>
<scope>test</scope>
</dependency>

SampleServletTest.java

package example;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.mortbay.jetty.testing.HttpTester;
import org.mortbay.jetty.testing.ServletTester;

public class SampleServletTest {

@Test
public void testDoGet() throws Exception {
ServletTester tester = new ServletTester();
tester.addServlet(SampleServlet.class, "/index");
tester.start();

HttpTester request = new HttpTester();
request.setMethod("GET");
request.setHeader("Host", "tester"); // should be "tester"
request.setURI("/index");
request.setVersion("HTTP/1.1");
request.setContent("");

String responses = tester.getResponses(request.generate());
HttpTester response = new HttpTester();
response.parse(responses);

assertThat(response.getStatus(), is(equalTo(200)));
}
}

jetty 9.x

ServletTester 的 API 在 Jetty 9.x 中有了很大改进。

pom.xml

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.0.7.v20131107</version>
<scope>test</scope>
</dependency>

SampleServletTest.java

package example;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.servlet.ServletTester;

public class SampleServletTest {

@Test
public void testDoGet() throws Exception {
ServletTester tester = new ServletTester();
tester.addServlet(SampleServlet.class, "/index");
tester.start();

HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET");
request.setHeader("Host", "tester"); // should be "tester"
request.setURI("/index");
request.setVersion("HTTP/1.1");
request.setContent("");

HttpTester.Response response = HttpTester.parseResponse(tester.getResponses(request.generate()));

assertThat(response.getStatus(), is(equalTo(200)));
}
}

新 API 看起来很酷,但不幸的是上面的代码运行起来很慢......这段代码每次运行需要 10 秒。你能相信吗?

有没有人知道这个问题?如果这只是我的错误,那真是个好消息。

最佳答案

这是您所拥有的请求配置的正常行为。

它与 HTTP 持久连接有关。

Jetty 6 的 servlet 测试器默认为 HTTP/1.0 行为。

HTTP/1.0 没有关于持久连接的官方规范,但客户端多年来已经发展为采用非持久行为,可以用协商的 Connection header 覆盖。

对于 HTTP/1.0,它的 1 个请求,然后是 1 个响应,然后关闭连接。除非客户端发送一个 Connection: Keep-Alive header (并且服务器以相同的 header 响应)

Jetty 9 的 HttpTester also defaults to HTTP/1.0 .

您在示例中指定了 request.setVersion("HTTP/1.1");,除非另有声明,否则所有连接都被视为持久连接。所以添加 Connection: close 将强制服务器在发送响应后关闭连接,而不是等待另一个请求。

所以你在这里有两个选择:

  1. 坚持使用 HTTP/1.1 并添加 request.setHeader("Connection", "close");
  2. 或将您的 HTTP 版本降级到 1.0。使用:
    • request.setVersion("HTTP/1.0");
    • 或注释掉对 request.setVersion(); 的调用并依赖默认行为。

关于java - 为什么 Jetty 9.x 中的 ServletTester 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com