Это не так просто сделать «только для первого звонка». Предполагается, что каждый запрос получает свою собственную последовательность строк, если только вы не предприняли конкретные шаги c, чтобы изменить это. И это на двух уровнях: - WebFlux
: каждый запрос приводит к отдельному вызову метода контроллера, поэтому Flux
создается заново - Reactor
: большинство Flux
"холодные", ie они не генерируйте данные, пока они не подписаны, и каждая подписка регенерирует отдельный набор данных.
Таким образом, даже если вы вернули кэшированный Flux
, он , вероятно, будет по-прежнему обслуживать каждый запрос. отдельно.
Существует способ share()
долгоживущего Flux
, чтобы более поздние новички могли видеть только те данные, которые становятся доступными после , когда они подписались на общий Flux
, что может помочь с аспектом «только первый запрос» вашего требования.
Предполагается, что getData()
само по себе является холодным (ie простое обращение к нему не вызывает какой-либо значимой обработки):
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;
}