问题描述
我有一个接受 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
。默认情况下,它会将异常打印到控制台。
您可以configure it,但无论如何您都不会获得对相应 HTTP 请求的引用(异常可能来自不同的事物)。
大多数此类问题通常是在单元/集成/验收测试期间发现的。
对于其余部分,您可以在路由器定义上设置超时处理程序,以确保请求在默认 30 秒之前结束。
如果您不想错过任何未捕获的异常,您应该切换到 Vert.x Rxified API。使用 RxJava 时,任何抛出的异常都会报告给订阅者。