【问题标题】:Response not submitted when rxEnd is used in HTTP server在 HTTP 服务器中使用 rxEnd 时未提交响应
【发布时间】:2020-05-15 09:03:33
【问题描述】:

我有一个用 vert.x + 响应式扩展编写的两个 verticle 服务器。 HTTP 服务器 verticle 使用事件总线向 DB verticle 发送请求。在收到来自 DB verticle 的响应(通过事件总线)后,我使用 rxEnd 将响应发送到 http 客户端。但是,客户似乎没有收到此响应并最终超时。如果我改用 end(),一切正常。我使用邮递员来测试这个 REST API。将 DB Verticle 的结果转发到客户端的代码请参见下文。

routerFactory.addHandlerByOperationId("createChargePoints", routingContext -> {
            RequestParameters params = routingContext.get("parsedParameters");

            RequestParameter body = params.body();
            JsonObject jsonBody = body.getJsonObject();

            vertx.eventBus().rxRequest("dbin", jsonBody)
                    .map(message -> {
                        System.out.println(message.body());
                        return routingContext.response().setStatusCode(200).rxEnd(message.body().toString());
                    })
                    .subscribe(res -> {
                        System.out.println(res);
                    }, res -> {
                        System.out.println(res);
                    });
        });

【问题讨论】:

    标签: vert.x


    【解决方案1】:

    rxEnd 方法是end 的变体,它返回Completable。前者是懒惰的,后者不是。

    换句话说,如果你调用rxEnd,你必须订阅Completable,否则什么都不会发生。

    查看您的 sn-p 的代码,我认为没有必要使用 rxEnd。实际上,您似乎不需要知道请求是否发送成功。

    【讨论】:

    • 酷,我认为这是问题所在,我需要订阅 observable!但是你能解释一下为什么不需要 rxEnd 吗? end() 是异步的吗?
    • 它不是同步的,即使所有内容还没有发送到客户端,它也会返回。所以如果发送失败不需要采取措施,调用end就足够了。
    猜你喜欢
    • 2018-07-31
    • 2023-03-05
    • 2021-04-14
    • 2014-08-23
    • 1970-01-01
    • 2014-05-28
    • 2019-10-04
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多