Vert.x - 如何知道哪个连接已关闭



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

我怎么知道哪个连接是实际关闭的连接?我有多个活动连接。 我试图在HttpServerHttpClientRequest中添加exceptionHandler,但他们都从未被召唤过。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新