【问题标题】:Vertx not able to handle internal code error to client automaticallyVertx 无法自动处理客户端的内部代码错误
【发布时间】:2021-05-25 10:59:40
【问题描述】:

我有一个接受 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.x vertx-verticle vertx-eventbus


    【解决方案1】:

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

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

    大多数此类问题通常在单元/集成/验收测试期间发现。

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

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

    【讨论】:

    • 我已经配置了 exceptionHandler 并且它正在打印异常详细信息,但是我不能不结束带有异常详细信息的响应。在超时处理程序上,它看起来像触发了一个静态超时,所以当异常发生时它不会超时对吗?
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 2012-03-30
    • 2014-05-14
    • 2022-11-13
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多