如何在Eventloop中更早地执行Vertx处理程序?

人气:142 发布:2023-01-03 标签: asynchronous vert.x vertx-verticle vertx-httpclient vertx-eventbus

问题描述

我使用的是Vertx 3.5.0和非常新的版本。当客户端取消其请求时,我正在尝试取消代码执行。

目前,我们要做的第一件事就是部署一个Verticle来运行HttpServer,然后将我们的所有路由添加到路由器。从这里开始,我们为每个路由提供了一个处理程序函数。在此处理程序中,我尝试执行以下操作:

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

这是我见过的唯一真正捕获连接关闭的方法,但问题是它没有在Eventloop中足够早地执行处理程序。因此,如果我在其中有任何日志,它将如下所示:

...[vert.x-事件循环-线程-0].....

...[vert.x-事件循环-线程-0].....(假设我在此时取消了请求)

...[vert.x-事件循环-线程-0].....

...[vert.x-事件循环-线程-0].....(等待异步数据库调用之前的常规执行的最终日志)

...[vert.x-事件循环-线程-0].....(执行CloseHandler代码)

我希望loseHandler代码在事件实际发生时中断进程并在本质上执行。

无论我何时取消请求,情况似乎总是如此,因此我认为我遗漏了Vertx处理异步的方式。

我尝试通过Worker Verticle在来自Router对象的lockingHandler内部和来自HttpServer对象的ConnectionHandler内部执行closeHandler代码。所有结果都相同。

主代码执行也是不是由辅助垂直对象执行的,只是常规垂直对象执行。

谢谢!

推荐答案

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

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

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

19