Vertx 3:HTTP服务器的Handler <routingcontext>将在事件/运行循环中执行,还是在单独的thred中执行?

时间:2017-01-17 11:47:40

标签: vert.x

问候;

我想知道我是否创建了一个vertx httpServer并添加了一个处理程序类来处理请求。处理程序实例中的代码是在同一个线程(事件循环线程)中执行还是在一个单独的线程/线程池中异步执行,并且不会减慢HTTPServer监听新请求操作的速度?

目前,我有一个Handler实例(一个实现Handler接口的spring signelton bean)。当很多对httpserver的HTTP请求到达时,处理程序代码会缓慢处理请求(请求在请求完成很长一段时间后执行,但不会抛出vertx ThreadBlocked异常)

1 个答案:

答案 0 :(得分:1)

简短的回答是肯定的。每个服务器Verticle都绑定到一个事件循环线程。每个处理程序都绑定到同一个线程。这很容易检查:

public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();

    vertx.deployVerticle(new ServerVerticle());
}

public static class ServerVerticle extends AbstractVerticle {

    @Override
    public void start() {
        Router router = Router.router(vertx);
        router.get("/").handler((r) -> {
            System.out.println("Handler " + Thread.currentThread().getName());
            r.response().end("");
        });


        System.out.println("Main verticle " + Thread.currentThread().getName());
        vertx.createHttpServer().requestHandler(router::accept).listen(8888);
    }
}

访问服务器,您会发现您的处理程序与服务器位于同一个事件循环线程中。

如果您的工作处理程序较慢,请使用EventBus和worker Verticle:
http://vertx.io/docs/vertx-core/groovy/#worker_verticles