【问题标题】:Reactor Mono, how to synch process (using .map()) and return Mono<void> from response.setComplete()Reactor Mono,如何同步进程(使用 .map())并从 response.setComplete() 返回 Mono<void>
【发布时间】:2020-03-17 04:07:08
【问题描述】:

我有这个方法可以获取重定向 url,然后重定向到那个 url

private Mono<Void> redirectToUrl(ServerHttpResponse response, String status) {
        String queryParameter = "?status=" + status;
        return getRedirectUrl(queryParameter)
                .flatMap(url -> {
                    response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
                    response.getHeaders().setLocation(url);
                    return response.setComplete();
                });
    }

在第 4 行中,我使用 flatmap,它将修改 response 对象异步,在这种情况下,响应将立即返回给客户端,而无需重定向。

我不能将map()response.setComplete() 一起使用,因为它会返回Mono&lt;Mono&lt;void&gt;&gt;,我需要返回Mono&lt;void&gt;

如何同步处理

 response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
                    response.getHeaders().setLocation(url);
                    return response.setComplete();

并返回Mono&lt;void&gt;

【问题讨论】:

    标签: java reactive-programming spring-webflux project-reactor


    【解决方案1】:

    如果你必须同步处理它,你可以使用map(),然后调用.then(),它会等待Mono完成,然后简单地传递完成信号。

    但是,据我了解,flatMap() 调用 应该 可以正常工作,因为在 flatMap() 完成之前,Mono 仍然不会完成 - 如果是否异步。我怀疑您的代码未按预期运行的实际原因是因为调用redirectToUrl() 的任何方法都没有等待返回的Mono 在返回响应之前完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2020-11-19
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多