Метод создаёт Mono с вызовом внешнего сервиса, но не возвращает его и ни на что не подписывается. Что произойдёт?
- Почему вызов в Mono не выполнился?
Ничего не произойдёт: Mono и Flux холодные — описывают намерение, а работа начинается при подписке. Не вернули Mono фреймворку и не подписались — вызова не будет.
- Возвращать Mono из контроллера — подпишется WebFlux
- «Выстрелить и забыть» — subscribe() с обработкой ошибок, лучше вынести в отдельный поток событий
- Двойная подписка выполнит вызов дважды — cache() если нужно один раз
А ещё Частая ошибка — then() без возврата результата наружу
Подробно
Это ошибка номер один у тех, кто переходит на реактивный стиль: цепочка выглядит как выполненный код, но фактически является лишь рецептом. В контроллере WebFlux подписку делает сам фреймворк, когда вы возвращаете Mono, — поэтому забытый return превращает вызов в тихий no-op без единой ошибки в логе. Внутри бизнес-логики цепочки нужно соединять операторами (flatMap, then, zip), а не вызывать методы ради побочного эффекта. Вызывать subscribe() вручную в контроллере не следует: так теряются backpressure, отмена при разрыве соединения и передача контекста. Холодность означает ещё и то, что каждая новая подписка запускает работу заново — при необходимости общего результата применяют share или cache.
Что хотят услышать
- Ленивость и подписка.
- Как правильно запускать.
- Повторная подписка.
Частые ошибки
- Забыть вернуть Mono из метода и получить молчаливое бездействие.
- Вызывать subscribe() вручную внутри обработчика запроса.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Вызов выполнится сразу при создании Mono, синхронно
- ✓Ничего: без подписки цепочка не выполняется
- ✗Вызов выполнится, но результат будет потерян
- ✗Будет брошено исключение об отсутствии подписчика
Что спросят дальше
- Чем горячий publisher отличается от холодного?
- Почему повторная подписка выполняет работу заново?
Разбор темы
- Reactive и Spring WebFlux
Неблокирующая модель и event loop, Reactive Streams и Reactor (Mono/Flux), backpressure, реактивный стек целиком, выбор MVC/WebFlux и цена сложности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.