vert.x - Vertx 无法自动处理客户端的内部代码错误
问题描述
我有一个接受 REST 请求的 Verticle,通过事件总线从其他 Verticle 获取数据并响应客户端。
vertx.exceptionHandler(event -> logger.error("Vertx exception ", event));
router.get("/api/v1/:param").handler(this::routerHandler);
public void routerHandler(RoutingContext rc) {
vertx.eventBus().request("data", param,
result -> {
if (result.succeeded()) {
logger.info("Request handled successfully");
// intentionally creating exception body() will return String
JsonObject jsonObject = (JsonObject) result.result().body();
rc.response().end(jsonObject)
}else{
logger.error("Request failed");
}
}
当引发异常时,它会在我在 vertx 实例中设置的异常处理程序中打印,但之后 vertx 不会立即向客户端报告异常,而是等待超时(30 秒)发生。
我尝试将错误处理程序附加到路由器对象并将故障处理程序附加到路由对象,但没有任何帮助立即向客户端报告异常。我知道我可以尝试 catch 并在 catch 块中报告错误。但是我想知道是否有任何其他方法来处理这个问题,比如 Servlet 或 Spring MVC 报告给客户端,即使代码中没有处理异常。
router.errorHandler(500,routingContext -> {
System.out.println(routingContext.failed());
routingContext.response().end("Exception ");
});
router.route().handler(BodyHandler.create()).failureHandler(routingContext -> {
解决方案
未捕获的异常会报告给上下文exceptionHandler
。默认情况下,它将异常打印到控制台。
您可以对其进行配置,但无论如何您都不会获得对相应 HTTP 请求的引用(异常可能来自不同的事物)。
大多数像这样的问题通常是在单元/集成/验收测试期间发现的。
对于其余部分,您可以在路由器定义上设置超时处理程序,以确保请求在默认的 30 秒之前结束。
如果您不想错过任何未捕获的异常,您应该切换到Vert.x Rxified API。使用 RxJava 时,任何抛出的异常都会报告给订阅者。
推荐阅读
- mysql - 优化具有连接的 MySQL 查询
- linux - 如何使用 hexdump 或 xxd 获取特定格式?
- angular - 角度材料垫菜单未显示其他组件中的开始操作
- python - 函数 range() 步的步长值如何?
- java - 在 Spring 存储库方法中更改优先级
- python-3.x - 剪辑是做什么的?当他们将它用于测试集时
- android - 使用 LiveData 更新 RecyclerView 中的消息列表而不重新发布整个列表
- php - 如何从 MySQL 中表的列中获取特定项目并使用它来制作另一个
- python - 没有循环的特定数据集组
- css - 如何从重复中修复线性渐变