gpt4 book ai didi

java - 如何在WebClient Vert.x中立即发送请求?

转载 作者:太空宇宙 更新时间:2023-11-04 10:31:58 26 4
gpt4 key购买 nike

我想对我的 Restful API 服务器进行基准测试,因此我向它发送了大量请求来测量吞吐量和延迟。我使用 Vert.x WebClient 创建客户端。

首先,我创建从 AbstractVerticle 扩展的 BenchmarkVerticle 并在 start 方法中创建一个 WebClient

public class BenchmarkVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> future) {
WebClient client = WebClient.create(vertx);

while (true) {
// warm up in 10s and benchmark in 20s by sending requests
client.post(Server.port, "localhost", "/api")
.send(ar -> {
// do something after receiving response
});
}
}
}

然后我在 main 中部署 BenchmarkVerticle

public static void main(String[] args) {
VertxOptions options = new VertxOptions();
options.setBlockedThreadCheckInterval(1000*60*60); // make BlockedThreadChecker not show
options.setWorkerPoolSize(40);
Vertx vertx = Vertx.vertx(options);

DeploymentOptions doptions = new DeploymentOptions()
.setWorker(true);

vertx.deployVerticle(new BenchmarkVerticle(), doptions);
}

我发现请求仅在 start 方法完成时发送。我认为每个请求都会放入队列中,以便在方法 start 完成后执行。它影响我的基准测试结果。我尝试通过 DeploymentOptions 对象中的 setMultiThreaded(true) 使用多线程来使其同时发送,但它说:

java.lang.IllegalStateException: Cannot use HttpClient in a multi-threaded worker verticle

那么如何在WebClient中立即发送请求呢?注意:英语不是我的母语。如果您觉得难以理解,我会更详细地解释。

最佳答案

我不确定我是否理解这个设置。 BenchmarkVerticle 似乎没什么用,除非它有更多你在帖子中没有透露的逻辑。

  • 如果 BenchmarkVerticle 负责处理请求
    • 从此类中删除 WebClient 引用
    • 请务必在 start() 主体末尾调用 future.complete()
  • ...否则只需将其删除

然后...

在具有 main() 方法的类中

  • 在此处创建WebClient
  • 然后使用允许您提供completionHandler的重载版本的deployVerticle部署测试所需的任何Verticle:

deployVerticle(String name, DeploymentOptions options, Handler> completionHandler)

当您的 Verticle 最终部署时,将调用完成处理程序。在此处理程序中添加您的请求+响应处理。

关于java - 如何在WebClient Vert.x中立即发送请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49891555/

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