Можно ли отправить начальное значение? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть веб-метод, который возвращает объект потока, когда это будет время (он связан с пабом / подпрограммой). Возможно ли, по крайней мере, только для первого вызова вернуть значение по умолчанию?

public Flux<String> receiveStream() {
        return myReactiveService.getData() //here can I return a value at start? //.map(...);

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Это не так просто сделать «только для первого звонка». Предполагается, что каждый запрос получает свою собственную последовательность строк, если только вы не предприняли конкретные шаги 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;
}
0 голосов
/ 23 марта 2020

я думаю, что вы ищете это Flux # defaultIfEmpty

...