Spring Web Flux – это фреймворк для Java, обеспечивающий поддержку реактивного программирования. Эта структура была создана PIVOTAL , компанией, стоящей за разработкой Spring, и основана на проекте Reactor .
Реактивное программирование – это парадигма, которая состоит в том, чтобы рассматривать почти все как поток элементов (поток). В настоящее время веб-приложениям требуется большая динамичность, а это означает, что эти приложения выполняют операции в режиме реального времени.
Те, кто имел дело с AJAX в прошлом, наверняка помнят, когда время работы компьютера периодически обновлялось. Это создавало впечатление, что все происходило онлайн, не было необходимости перезагружать всю страницу.
Реактивное программирование следует схеме Издатель/Подписчик , аналогичной шаблону проектирования наблюдателя. Следовательно, клиенту не нужно делать так много запросов к серверу.
Мы собираемся начать с простого, но очень наглядного примера, чтобы показать самые основные функции Spring WebFlux . Для этого мы будем использовать Spring Boot 2, который использует Spring Framework 5.
Мы можем создать начальный проект в https://start.spring.io
Создание RestController
Первое, что мы собираемся сделать, это создать контроллер с аннотацией @RestController . Этот контроллер будет генерировать случайные целые числа каждую секунду, а затем возвращать их с помощью объекта Flux.
В Моно и в Flux объекты являются основными строительными блоками Spring Web Flux. Если конкретная операция возвращает один объект, то система возвращает объект Mongo. Если операция возвращает несколько элементов, тип потока представляет эти элементы.
@RestController public class EventController { Logger logger = LoggerFactory.getLogger(EventController.class); @GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public FluxgetNumbers() { Random r = new Random(); int min = 0; int max = 32767; return Flux.fromStream(Stream.generate(() -> r.nextInt(max - min) + min) .map(s -> String.valueOf(s)) .peek((msg) -> { logger.info(msg); })) .map(s -> Integer.valueOf(s)) .delayElements(Duration.ofSeconds(1)); } }
Обратите внимание, что метод getnumber() выдает ЗНАЧЕНИЕ TEXT_EVENT_STREAM_VALUE . Это указывает на то, что система отправляет данные в виде событий, отправленных сервером, или SSE.
Создание клиента реактивных событий
Для следующего шага мы собираемся создать реактивный EventClient:
public class EventClient { Logger logger = LoggerFactory.getLogger(EventClient.class); @Bean WebClient getWebClient() { return WebClient.create("http://localhost:8081"); } @Bean CommandLineRunner demo(WebClient client) { return args -> { client.get() .uri("/events") .accept(MediaType.TEXT_EVENT_STREAM) .retrieve() .bodyToFlux(Integer.class) .map(s -> String.valueOf(s)) .subscribe(msg -> { logger.info(msg); }); }; } }
Поскольку мы ожидаем потока событий, нам нужно использовать метод body To Flux() , чтобы вернуть правильный ответ.
Теперь мы запускаем приложение Spring Boot. Каждую секунду , система будет генерировать и печатать случайные числа на консоли.
На этом простом примере мы можем наблюдать самые основные функции потоковой передачи событий в реальном времени с использованием Spring Web Flux.
В заключение, реактивное программирование состоит в том, чтобы рассматривать все как поток элементов, следовательно, оно позволяет выполнять операции над этим потоком и передавать его клиенту таким образом, чтобы он работал асинхронно, и Spring WebFlux является отличным вариантом для рассмотрения, если наши задачи требуют этих возможностей.
Оригинал: “https://dev.to/dariocarrasquel/a-short-example-of-real-time-event-streaming-using-spring-webflux-5a81”