问题描述
我正在使用 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