订阅在什么时候发生? (spring 网络通量)

At what point does the subscription take place? (spring webflux)

spring webflux 在什么时候进行订阅?我到处都读到必须有订阅,否则不会发生任何变化。在我使用 Spring Webflux 的短暂时间里,我从未在控制器或服务中看到 subscribe()

我的疑问还在于使用 flatMap()map()、...等时,订阅是在什么时候发生的?

我所看到的并不能真正解决我的疑惑。

public Flux method(){
    ....
    myFlux.flatMap(data -> {
          ....

    }).flatMap(e -> { .... });
}

我知道这是一个异步问题,但是每个 flatMap 同时运行?...所以有时我注意到一些数据是空的。

您需要在平面图之后调用 .subscribe()block() 函数。 Here's an example.

假设myFlux是Flux类型,下面将按照上面的例子执行订阅 myFlux.subscribe(System.out::println);

但是在您的 method 函数中,您将返回一个 Flux 对象 - 所以这取决于 method() 函数的消费者想要如何订阅 Flux。您不应该尝试从

内订阅 Flux

它是订阅返回的MonoFlux的框架(spring-webflux)。例如,如果您使用 Netty(这是默认设置),那么根据我的调试,订阅会​​在此处发生: https://github.com/reactor/reactor-netty/blob/db27625064fc78f8374c1ef0af3160ec3ae979f4/reactor-netty-http/src/main/java/reactor/netty/http/server/HttpServer.java#L962

此外,本文可能有助于理解以下情况下会发生什么: https://spring.io/blog/2019/03/06/flight-of-the-flux-1-assembly-vs-subscription

答案是:视情况而定。

例如,如果这是一个 Spring 控制器方法,那么订阅 MonoFlux.

的是框架本身

如果是Scheduler时不时触发的方法,那么必须显式订阅MonoFlux,否则不做任何处理

这意味着如果您的应用程序只公开一个 REST API 并且不需要以任何其他方式触发任何处理,那么您很可能永远不需要显式订阅 MonoFlux 因为 Spring 会由您来处理。