当前位置: 首页 > 知识库问答 >
问题:

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

危斯伯
2023-03-14

招呼

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

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

共有1个答案

鲁博瀚
2023-03-14

简而言之,答案是肯定的。每个服务器垂直链接都绑定到一个事件循环线程。每个处理程序都绑定到同一个线程。很容易检查:

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和工作器顶点:
http://vertx.io/docs/vertx-core/groovy/#worker_verticles

 类似资料:
  • 我有一个程序,当你点击按钮,它将执行一个名为

  • 问题内容: 我有一个包含单元测试的Go文件,其中一些使用了公共变量。我正在测试的代码中使用了另一个全局变量。所有这些都可能导致问题。 在Go中,当我们执行位于同一文件中的测试时,它们如何运行?并行还是下一个不会在前一个完成之前开始? 问题答案: 测试起来真的很容易: 使用运行它,输出显示它是顺序的: 因此,正常的测试是依次执行的,但是请不要忘记未定义顺序:如何依次运行golang测试? 还要注意,

  • 是否可以在与“主”应用程序分开的线程池中处理像这样的执行器请求? 我为什么要问?我有一个应用程序有时可能会用完所有可用的线程,而Kubernetes健康检查由于没有线程来计算健康endpoint请求而失败。 我希望确保无论应用程序的负载有多大,都处理了每个健康请求。 我在考虑可能定义一个单独的线程池来操作执行器,但我不确定如何做到这一点。

  • 在我目前使用Netty的大多数示例中,我看到boss执行器是一个缓存线程池。根据我的理解,事件循环应该只有一个线程,为什么我们需要boss事件循环的缓存线程池?

  • 我有一个包含GWT UI和服务器后端的GWT项目。服务器后端包含通过GWT的RPC向UI公开的Java GWT服务。 由于项目已经有了很大的增长,随着后端需要越来越多的时间来启动,我正在考虑将UI移到一个单独的项目中,想法是在一个单独的VM中运行后端。后端比较稳定,是我们花时间最多的UI。在单独的VM中使用这两个,我们可以更有效地处理UI,因为我们只需要重新加载UI(在GWT开发模式下)并让后端运

  • 问题内容: 我一直在尝试并行化以下脚本,特别是for循环。我怎样才能做到这一点? 问题答案: 更换 与