Spring webflux 是否可以发送初始值?

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()//在这

我有一个web方法,它在需要时返回一个flux对象(它链接到一个pub/sub)。 是否至少可以只在第一次调用时返回默认值

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;
}