Получить доступ

Метод создаёт Mono с вызовом внешнего сервиса, но не возвращает его и ни на что не подписывается. Что произойдёт?

MiddleReactive и WebFluxWebFlux
Ещё спрашивают так:
  • Почему вызов в Mono не выполнился?
Коротко

Ничего не произойдёт: Mono и Flux холодные — описывают намерение, а работа начинается при подписке. Не вернули Mono фреймворку и не подписались — вызова не будет.

  • Возвращать Mono из контроллера — подпишется WebFlux
  • «Выстрелить и забыть» — subscribe() с обработкой ошибок, лучше вынести в отдельный поток событий
  • Двойная подписка выполнит вызов дважды — cache() если нужно один раз

А ещё Частая ошибка — then() без возврата результата наружу

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Это ошибка номер один у тех, кто переходит на реактивный стиль: цепочка выглядит как выполненный код, но фактически является лишь рецептом. В контроллере WebFlux подписку делает сам фреймворк, когда вы возвращаете Mono, — поэтому забытый return превращает вызов в тихий no-op без единой ошибки в логе. Внутри бизнес-логики цепочки нужно соединять операторами (flatMap, then, zip), а не вызывать методы ради побочного эффекта. Вызывать subscribe() вручную в контроллере не следует: так теряются backpressure, отмена при разрыве соединения и передача контекста. Холодность означает ещё и то, что каждая новая подписка запускает работу заново — при необходимости общего результата применяют share или cache.

Что хотят услышать

  • Ленивость и подписка.
  • Как правильно запускать.
  • Повторная подписка.

Частые ошибки

  • Забыть вернуть Mono из метода и получить молчаливое бездействие.
  • Вызывать subscribe() вручную внутри обработчика запроса.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Ничего: publisher холодный, и без подписки код внутри цепочки не выполняется
  • ✗Вызов выполнится сразу при создании Mono
  • ✗Вызов выполнится, но результат будет потерян
  • ✗Будет брошено исключение об отсутствии подписчика

Что спросят дальше

  • Чем горячий publisher отличается от холодного?
  • Почему повторная подписка выполняет работу заново?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем