如何让 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 处理程序在事件循环中更早地执行?的主要内容,如果未能解决你的问题,请参考以下文章