httpclient - Vert.x - 如何知道哪个连接被关闭
问题描述
我有一个 Vert.x 应用程序,它以服务器的形式获取 HTTP 请求,然后随后将数据(以及 HTTP 请求)作为客户端发送到其他几台服务器(多个客户端退出)。我在日志中看到有时我得到io.vertx.core.VertxException: Connection was closed
但没有其他信息。
我怎么知道哪个连接是实际关闭的?我有多个活跃的连接。我尝试添加exceptionHandler
toHttpServer
和 to HttpClientRequest
,但从未调用过它们。
解决方案
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 响应流),并且如果您仍然在日志中收到这些错误 - 也许您可以按照评论者的建议忽略它们。
推荐阅读
- micronaut - #运行 Gralvm Micronaut 数据时出错
- javascript - 迭代一系列对象,然后插入到 Bootstrap 表中
- tensorflow - 贝叶斯神经网络实现低准确率和不学习
- python - 如何在 selenium 中编码/解码名称,以便代码不会抛出“utf-8”编解码器无法解码位置 1 错误中的字节 0xca?
- time - 如何从 KQL 的时间跨度中获取分钟数
- c# - 重新调整数据时并发存储过程调用导致延迟
- python - matplotlib 图形线未显示
- apache-camel - concurrentConsumers 不是从一开始就立即创建的
- laravel - 将 laravel 会话共享到多个应用程序(Laravel 应用程序和 VueJS 应用程序)
- powerquery - 了解 Function.ScalarVector 的行为