订阅在什么时候发生? (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
它是订阅返回的Mono
或Flux
的框架(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 控制器方法,那么订阅 Mono
或 Flux
.
的是框架本身
如果是Scheduler时不时触发的方法,那么必须显式订阅Mono
或Flux
,否则不做任何处理
这意味着如果您的应用程序只公开一个 REST API 并且不需要以任何其他方式触发任何处理,那么您很可能永远不需要显式订阅 Mono
或 Flux
因为 Spring 会由您来处理。
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。您不应该尝试从
它是订阅返回的Mono
或Flux
的框架(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 控制器方法,那么订阅 Mono
或 Flux
.
如果是Scheduler时不时触发的方法,那么必须显式订阅Mono
或Flux
,否则不做任何处理
这意味着如果您的应用程序只公开一个 REST API 并且不需要以任何其他方式触发任何处理,那么您很可能永远不需要显式订阅 Mono
或 Flux
因为 Spring 会由您来处理。