#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, это то, что я ищу.