Реактор: 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.