首页 > 解决方案 > Reactor Mono,如何同步进程(使用 .map())并返回 Mono来自 response.setComplete()

问题描述

我有这个方法可以获取重定向 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()withresponse.setComplete()因为它会返回Mono<Mono<void>>,我需要返回Mono<void>

我怎样才能同步处理

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

并返回Mono<void>

标签: javareactive-programmingspring-webfluxproject-reactor

解决方案


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

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


推荐阅读