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

时间:2018-04-18 05:05:01

标签: java vert.x

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

首先,我从BenchmarkVerticle创建AbstractVerticle,并在WebClient方法中创建start

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
                   });      
        }
    }
}

然后我在BenchmarkVerticle

中部署main
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完成后执行。它会影响我的基准测试结果。我尝试在setMultiThreaded(true)对象中DeploymentOptions使用多线程来同时发送它,但它说:

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

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

1 个答案:

答案 0 :(得分:0)

我不确定我理解设置。 BenchmarkVerticle似乎毫无用处,除非它有更多你未在帖子中透露过的逻辑。

  • 如果BenchmarkVerticle负责处理请求
    • 从此课程中删除WebClient引用
    • 请务必在future.complete()
    • 正文的末尾拨打start()
  • ...否则只需删除它

...然后

在具有main()方法

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

deployVerticle(String name,DeploymentOptions选项,   处理程序&GT; completionHandler)

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