Как сгенерировать случайную строку и вытолкнуть ее с помощью Mono, которая будет отображаться в браузере каждые X секунд или со случайной задержкой в ​​Spring Reactive? - PullRequest
1 голос
/ 24 сентября 2019

Я бы хотел, чтобы браузер отображал случайно сгенерированную строку в браузере, как только API генерирует ее, используя Spring Reactive Mono.

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

@RestController
public class LogTailerController {

    @GetMapping(path = "/", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Mono<String> feed() {
        return Mono.just("foo-" + Math.random()).delayElement(Duration.ofSeconds(1));
    }

}

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

1 Ответ

1 голос
/ 25 сентября 2019

Возможно, вы захотите взглянуть на ConnectableFlux, что похоже на Flux, но специально разработано для непрерывного излучения элементов.Вы можете создать объект WebClient, который по умолчанию генерирует Mono через метод обмена.Затем просто обратитесь к маршруту, который вы создали в своем классе LogRailerController, для вызова метода канала.

public void connectFeed() {

        ConnectableFlux<String> printEverySecond = WebClient.create("/") // Since your route is "/"
                .post()
                .body(...)
                .exchange() // produces a Mono object
                .flatMap(response -> response.bodyToMono(String.class)) // transformed into a Mono<String> 
                .flux() // now a Flux<String>
                .replay(Duration.of(1, ChronoUnit.SECONDS))
                .publish(); // now a ConnectableFlux<String>

        printEverySecond.subscribe();
        printEverySecond.connect();

}

Вместо использования post().getBody() ... flatMap(...), вы также можете просто использовать get (),и позвоните .bodyToMono(String.class) сразу после .exchange.

Делая это, вы даже помещаете свою логику feed() в flatMap.Основная проблема этой стратегии, а также при использовании @RestController, заключается в том, что время ожидания запроса истекает, что довольно сложно с помощью RxNetty.С учетом вышесказанного, я бы рекомендовал иметь отдельный класс компонента, который вызывает ClientClass.printEverySecond (), когда он возвращается после 10 повторов, или каждые 10 секунд, или в зависимости от того, что вы считаете лучшим.Преимущество этой стратегии перед использованием @RestController заключается именно в том, что ее можно вызывать из другого класса так же, как вы вызываете любой другой метод bean-компонента.

Обратите внимание, что все темы здесь относятся к области начального этапа.зависимость от webflux - я не думаю, что вам понадобятся другие.

...