Реактор: Flux <объект> .subscribe() vs. .toStream()

У меня есть функция: Flux queryPerson (), которая запрашивает базу данных для создания объектов и возврата их в Flux. Когда я использую.subscribe(), приложение просто запускает код и выходит. Он не ждет, пока вернутся результаты запроса. Но когда я использую.toStream () для блокировки потока, я могу видеть распечатки. Что я делаю неправильно?

personRepository
    .queryPerson()
    .map(x -> x.getFirst().concat("ok"))
    .subscribe(i -> System.out.println(i))
    //.toStream().forEach(System.out::println)
;

1 ответ

Решение

Я предполагаю, что у вас нет какого-то веб-приложения, а скорее программа для запуска командной строки или простое Java-приложение. Учитывая, что приложение завершается раньше асинхронных задач, это нормально.

.подписываться

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

Именно так работает реактивное программирование: вы определяете поведение, у вас есть красивый абстрактный способ его запуска в некоторых других потоках и с вашим вызывающим потоком.

как указано в документации Flux

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

.toStream

С другой стороны, с .toStream вы получаете поток Java, и даже несмотря на то, что он имеет неизвестный размер, вы все равно повторяете его синхронно, как обычный поток Java.

Дополнительное объяснение можно найти в документации.toStream Flux.

Другие вопросы по тегам