Mono.switchIfEmpty с Mono.then порядок оценки - PullRequest
1 голос
/ 05 февраля 2020

Я строю реактивный конвейер, подобный этому, на netty-сервере с помощью Spring Web-Flux:

someService.getSettings(key) //Mono<Settings>
        .filter(Settings::isEnabled)
        .switchIfEmpty(Mono.error(
            new Exception("Setting is disabled.")
        )).then(/*Mono representing API fetch*/ someApi.fetch(param));

Насколько я понимаю, всякий раз, когда Settings::isEnabled возвращает false, конвейер будет пустым, и я буду получить моно, представляющее ошибку. Однако такого поведения не происходит. Мой someApi.fetch(param) вызов всегда срабатывает без завершения фильтра Mono. Таким образом, даже если Settings::isEnabled равно false или true, someApi.fetch(param) всегда запускается без завершения Mono.filter.

Как мне убедиться, что выдается ошибка, если фильтр возвращает пустое значение Mono и происходит только выборочный вызов когда я проверил, что настройка не отключена?

1 Ответ

0 голосов
/ 07 февраля 2020

это все еще java: этот вызов someApi.fetch(param) не выполняется внутри лямбды, поэтому он не может быть ленивым. в тот момент, когда выполнение достигает строки then, вызывается ваш метод fetch. Flux.defer оператор специально создан для того, чтобы обернуть этот вызов и сделать его ленивым.

...