首页 > 解决方案 > Vert.x - 如何知道哪个连接被关闭

问题描述

我有一个 Vert.x 应用程序,它以服务器的形式获取 HTTP 请求,然后随后将数据(以及 HTTP 请求)作为客户端发送到其他几台服务器(多个客户端退出)。我在日志中看到有时我得到io.vertx.core.VertxException: Connection was closed 但没有其他信息。

我怎么知道哪个连接是实际关闭的?我有多个活跃的连接。我尝试添加exceptionHandlertoHttpServer和 to HttpClientRequest,但从未调用过它们。

标签: httpclientvert.xhttpserver

解决方案


io.vertx.core.VertxException: Connection was closed可以为客户端连接和服务器连接触发。

如果远程服务器在完成响应之前关闭连接,您会在 HTTP 客户端连接上收到这些错误,并且您可以通过在客户端请求上设置适当的处理程序来捕获它们(使用 Vert.x 4,您d 做类似的事情...send().onFailure(err -> /* handle the failure */)),我相信你已经这样做了。

如果远程客户端在您的服务器完成响应之前断开连接,或者 - 如果连接启用了保持活动(这是 HTTP/1.1 连接的默认设置) - 即使在已发送响应。

  • 如果客户端在响应完全发送之前关闭了服务器连接,您应该能够捕获并处理 中的错误HttpServer.exceptionHandler(),我相信您已经这样做了。
  • 如果客户端在响应完全发送后关闭了服务器连接,而它处于保持活动状态,那么就没有HttpServerRequest(或者RoutingContext如果你正在使用vertx-web,正如你应该使用的那样)发生异常的地方,所以 Vert.x只会忽略错误(有关代码,请参见此处)。

那么为什么您仍然在日志中看到这些错误?它可能是各种各样的事情,因为该异常还用于处理 EventBus 连接和由 Vert.x 服务器管理的各种内部网络流 - 并且所有这些都没有堆栈跟踪(实际抛出的异常实例是在这里静态创建的),所以 Vert .x 以这种方式很糟糕。

我的建议:确保将错误处理程序附加到所有内容(如果使用它们,请注意 websocket 连接或 HTTP 响应流),并且如果您仍然在日志中收到这些错误 - 也许您可以按照评论者的建议忽略它们。


推荐阅读