Элемент PublishNext из потока, только если первое отправленное событие не соответствует критериям - PullRequest
0 голосов
/ 09 марта 2019

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 Ответ

1 голос
/ 11 марта 2019

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

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

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

...