0

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

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

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 如何处理异步的东西。

我已经尝试通过一个worker Verticle、Router对象的blockingHandler以及HttpServer对象的connectionHandler执行closeHandler代码。所有人都得到了相同的结果。

主要的代码执行也不是由一个worker Verticle执行的,只是一个普通的。

谢谢!

4

1 回答 1

0

您似乎误解了 acloseHandler是什么。这是一个回调方法,当请求被关闭时 Vert.x 会调用它。这不是提前终止请求的方法。

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

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

于 2021-03-27T21:35:50.117 回答