gpt4 book ai didi

java - 如何让 HttpAsyncClient 异步操作?

转载 作者:行者123 更新时间:2023-12-02 06:00:33 24 4
gpt4 key购买 nike

我正在尝试使用 HttpAsyncClient 通过每秒提交一百或一千个 HTTP 请求并对每个请求的响应进行计时来对我的 Web 应用程序进行压力测试。我的代码基于 this quickstart guide但似乎连接到服务器并发送 HTTP 请求的线程就坐在那里等待服务器的响应!相反,我希望它继续发送下一个 HTTP 请求,而不等待 HTTP 响应

这是我的测试代码:

public class TestAsyncHttpRequest {

private static final SimpleDateFormat FORMAT = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss.SSS");

public static void main(String[] args) throws Exception {

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
try {
// Start the client
httpclient.start();
final CountDownLatch latch = new CountDownLatch(100);
for (int i = 0; i < 100; i++) {
System.out.println("Sending POST request at "
+ FORMAT.format(new Date()));
final HttpPost request = new HttpPost(
"http://localhost:8080/test");
httpclient.execute(request, new FutureCallback<HttpResponse>() {

public void completed(final HttpResponse response) {
latch.countDown();
}

public void failed(final Exception ex) {
latch.countDown();
}

public void cancelled() {
latch.countDown();
}

});
Thread.sleep(50);
}
latch.await();
} finally {
httpclient.close();
}
}
}

相应的测试servlet只是打印请求的时间,然后 hibernate 20秒:

public class TestServlet extends HttpServlet {
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
getServletContext().log(
"TestServlet Received POST at: " + fmt.format(new Date()));
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

}

Servlet 输出如下 - 请注意,它每 20 秒仅接收两个请求:

INFO: TestServlet Received POST at: 2014-03-28 07:01:16.838
INFO: TestServlet Received POST at: 2014-03-28 07:01:16.838
INFO: TestServlet Received POST at: 2014-03-28 07:01:36.873
INFO: TestServlet Received POST at: 2014-03-28 07:01:36.873
INFO: TestServlet Received POST at: 2014-03-28 07:01:56.881
INFO: TestServlet Received POST at: 2014-03-28 07:01:56.881
INFO: TestServlet Received POST at: 2014-03-28 07:02:16.891
INFO: TestServlet Received POST at: 2014-03-28 07:02:16.891

是否有一些配置选项可以让我向服务器发送一千个 HTTP 请求而不产生大量线程?

最佳答案

HttpAsyncClient 对并发连接总数和每个主机的并发连接数有限制。

尝试增加它们:

CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
.setMaxConnTotal(100)
.setMaxConnPerRoute(100)
.build();

关于java - 如何让 HttpAsyncClient 异步操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22712059/

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