Spring webflux 是否可以发送初始值?
我有一个web方法,它在需要时返回一个flux对象(它链接到一个pub/sub)。 是否至少可以只在第一次调用时返回默认值Spring webflux 是否可以发送初始值?,spring-webflux,project-reactor,Spring Webflux,Project Reactor,我有一个web方法,它在需要时返回一个flux对象(它链接到一个pub/sub)。 是否至少可以只在第一次调用时返回默认值 public Flux<String> receiveStream() { return myReactiveService.getData() //here can I return a value at start? //.map(...); 公共流量接收流(){ return myReactiveService.getData()//在这
public Flux<String> receiveStream() {
return myReactiveService.getData() //here can I return a value at start? //.map(...);
公共流量接收流(){
return myReactiveService.getData()//在这里我可以在开始时返回一个值吗?//.map(…);
我想你要找的是我想你要找的是要做到这一点“只在第一次调用时”并不容易。每个请求都应该有自己的字符串序列,除非你采取具体步骤来改变它。这分为两个级别:
-WebFlux
:每个请求都会导致对控制器方法的单独调用,因此Flux
是新实例化的
-Reactor
:大多数Flux
都是“冷”的,即在订阅之前不会生成数据,每次订阅都会重新生成一个单独的数据集
因此,即使您返回一个缓存的流量
,它也可能会分别为每个请求提供服务
有一种方法可以share()
一个长期的Flux
,这样以后的新来者只能在订阅了共享Flux
后看到可用的数据,这可能有助于满足您需求的“仅第一个请求”方面
假设getData()
本身是冷的(即简单地调用它不会触发任何有意义的处理):
AtomicReference sharedStream=新的AtomicReference();
公共流量接收流(){
通量结果=sharedStream.get();
如果(结果==null){
Flux coldVersionWithInit=myReactiveService
.getData()
.startWith(第一个值)
.地图(…);
Flux hotVersion=coldVersionWithInit.share();
if(sharedStream.compareAndSet(空,热版本))
结果=热版本;
其他的
结果=sharedStream.get();
}
返回结果;
}
要做到这一点“只在第一次调用时”并不容易。每个请求都应该有自己的字符串序列,除非您采取具体步骤来更改。这有两个级别:
-WebFlux
:每个请求都会导致对控制器方法的单独调用,因此Flux
是新实例化的
-Reactor
:大多数Flux
都是“冷”的,即在订阅之前不会生成数据,每次订阅都会重新生成一个单独的数据集
因此,即使您返回一个缓存的流量
,它也可能会分别为每个请求提供服务
有一种方法可以share()
一个长期的Flux
,这样以后的新来者只能在订阅了共享Flux
后看到可用的数据,这可能有助于满足您需求的“仅第一个请求”方面
假设getData()
本身是冷的(即简单地调用它不会触发任何有意义的处理):
AtomicReference sharedStream=新的AtomicReference();
公共流量接收流(){
通量结果=sharedStream.get();
如果(结果==null){
Flux coldVersionWithInit=myReactiveService
.getData()
.startWith(第一个值)
.地图(…);
Flux hotVersion=coldVersionWithInit.share();
if(sharedStream.compareAndSet(空,热版本))
结果=热版本;
其他的
结果=sharedStream.get();
}
返回结果;
}
我不确定您的要求是否正确,但您可以检查此运算符:我不确定您的要求是否正确,但您可以检查此运算符:
AtomicReference<Flux<String>> sharedStream = new AtomicReference<>();
public Flux<String> receiveStream() {
Flux<String> result = sharedStream.get();
if (result == null) {
Flux<String> coldVersionWithInit = myReactiveService
.getData()
.startWith(FIRST_VALUE)
.map(...);
Flux<String> hotVersion = coldVersionWithInit.share();
if (sharedStream.compareAndSet(null, hotVersion))
result = hotVersion;
else
result = sharedStream.get();
}
return result;
}