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

Posted

技术标签:

【中文标题】如何让 Vertx 处理程序在事件循环中更早地执行?【英文标题】:How do I make a Vertx handler execute earlier in eventloop? 【发布时间】:2021-06-23 14:04:32 【问题描述】:

我正在使用 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执行的,只是一个普通的。

谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

啊,我应该措辞更好;我正在尝试设置一个处理程序,以便客户端在收到完整响应之前取消他们的请求,而不是自己关闭连接。至于版本,我同意!但可悲的是,我的公司一直坚持升级。

以上是关于如何让 Vertx 处理程序在事件循环中更早地执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何比任何其他全局或静态变量更早地创建/构造类实例?

为啥 for loop 比它应该更早地刹车?

Bootstrap:如何更早地折叠导航栏

如何延迟 shell 脚本中的命令替换?

如何让音频在 React 中更流畅地循环播放?

我怎样才能更早地呼叫运输人员?