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

标签 java vert.x

我想对我的 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/

相关文章:

java - JPA 2 查询返回不完整的结果

java - 双数组mongodb 3

java - 两个基本相同的代码库,我如何适本地合并它们?

java - vertx中eventBus的使用

java - jetty LdapLoginModule : Login Failure: all modules ignored

java - 如何将Java Agent打包为Visual VM插件

Java/没有适用于请求的设备型号的 Activity

vert.x - 使用vertx读取大文件

javascript - Vertx.io 从 Java 服务器启动 JS Verticle

java - 使用 Redis 发布/订阅 : how to make a subscription expire