首页 > 解决方案 > 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 -> {

标签: vert.xvertx-verticlevertx-eventbus

解决方案


未捕获的异常会报告给上下文exceptionHandler。默认情况下,它将异常打印到控制台。

您可以对其进行配置,但无论如何您都不会获得对相应 HTTP 请求的引用(异常可能来自不同的事物)。

大多数像这样的问题通常是在单元/集成/验收测试期间发现的。

对于其余部分,您可以在路由器定义上设置超时处理程序,以确保请求在默认的 30 秒之前结束。

如果您不想错过任何未捕获的异常,您应该切换到Vert.x Rxified API。使用 RxJava 时,任何抛出的异常都会报告给订阅者。


推荐阅读