如何在事件循环中更早地执行 Vertx 处理程序?

问题描述

我正在使用 Vertx 3.5.0 并且对它非常陌生。当客户取消他们的请求时,我试图取消代码执行。

目前设置为我们做的第一件事是部署一个 Verticle 来运行一个 HttpServer,然后我们将所有的路由添加到路由器。从这里我们每个路由都有一个处理函数在这个处理程序中,我正在尝试:

routingContext.request().connection().closeHandler({
//execute logic for ending execution
});

这是我见过的唯一一种实际捕获连接关闭方法,但问题是它没有在事件循环中足够早地执行处理程序。因此,如果我在那里有任何日志,它将如下所示:

...[vert.x-eventloop-thread-0].....

...[vert.x-eventloop-thread-0].....(假设我此时取消了请求)

...[vert.x-eventloop-thread-0].....

...[vert.x-eventloop-thread-0].....(在等待异步数据库调用之前常规执行的最终日志)

...[vert.x-eventloop-thread-0].....(执行closeHandler代码

我希望 closeHandler 代码能够中断进程并在事件实际发生时执行。

无论何时取消请求,情况似乎总是如此,因此我认为我缺少有关 Vertx 如何处理异步性的一些信息。

我已经尝试通过工作线程执行 closeHandler 代码,在 Router 对象的 BlockingHandler 内部和 HttpServer 对象的 connectionHandler 内部。结果都是一样的。

主要代码的执行也由工作线程执行,只是一个普通的。

谢谢!

解决方法

您似乎误解了 closeHandler 是什么。这是一个回调方法,Vert.x 在请求关闭时调用。不能提前终止请求。

如果您想提前终止请求,一种方法是改用 response().close()

作为脚注,我想提一下 Vert.x 3.5.0 现在已经 4 年了,你应该升级到 3.9,或者,如果可以的话,升级到 4.0