我有一个 Vert.x 应用程序,它作为服务器获取 HTTP 请求,然后将数据(HTTP 请求)作为客户端发送到其他几个服务器(多个客户端退出)。 我在日志中看到有时我会io.vertx.core.VertxException: Connection was closed
但没有其他信息。
我怎么知道哪个连接是实际关闭的连接?我有多个活动连接。 我试图在HttpServer
和HttpClientRequest
中添加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 响应流),如果您仍然在日志中收到这些错误 - 也许您可以按照评论者的建议忽略它们。