Публиковать следующий элемент из потока, только если первое отправленное событие не соответствует критериям

#java #spring-webflux #project-reactor #reactive

#java #spring-webflux #проект-реактор #реактивный

Вопрос:

UserPreferenceFlux хранит информацию о пользовательских настройках в порядке приоритета, и мы должны учитывать только второе предпочтение, с первым предпочтением ничего не совпадает. Для соответствия предпочтениям требуется блокирующий вызов ввода-вывода. Я попробовал с приведенным ниже кодом, даже несмотря на совпадение с первым пользовательским предпочтением, я вижу, что для второго предпочтения выполняется вызов WebClient, в котором нет необходимости (поскольку первое совпадающее предпочтение уже выполняется).

 Flux<UserPreference> userPreferenceFlux = getUserPreferences();
UserPreferenceFlux 
.flatMap(preference -> checkForMatch()) // Blocking IO call for match check
.filter(preference -> preference.isMatchFound())
.next(); // The Idea is to consider next preference if current preference is 
         // not found
  

Комментарии:

1. Что checkForMatch() делает? Можете ли вы показать код? Возвращает ли оно логическое значение?

Ответ №1:

Используйте concatMap вместо flatMap .

По умолчанию flatMap запрашивает 256 настроек из источника и обрабатывает их все сразу. Это поведение «все сразу» уменьшается из-за того, что ваш checkForMatch() , похоже, блокирует, но все же: сам исходный код запрашивается чаще, чем вы хотите.

concatMap с другой стороны, будет запрашивать настройки из источника одну за другой, ожидая, пока не будет обработано текущее UserPreference , прежде чем запрашивать следующее.

Комментарии:

1. Спасибо @Simon, это то, что я ищу.