Сервер отправил событие. Spring Webflux возвращает имя события в ответе от контроллера покоя. - PullRequest
0 голосов
/ 02 апреля 2020

Я использую SSE с реактором Flux для сбора системных показателей linux и публикации в браузере (javascript источник событий).

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

Поскольку я возвращаю объект с сервера, достаточно ли иметь событие в качестве одного из ключей в ответе json, который будет идентифицирован источником событий.

Установка уникального номера на стороне клиента, который будет возвращен в событие в ответе json.

Спасибо за помощь!

Javascript:

jsonStreamObjectHeap.addEventListener("197e08e-f9a4-4e6e-9a04-220ade08a8f4",function(e){
        $.each(message, function(index, value) {
           /*some operation*/
        });
        }

Ответ от контроллера покоя:

{
   "event":"197e08e-f9a4-4e6e-9a04-220ade08a8f4",
   "data":"2048"
}

Код контроллера покоя:

 Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));
        interval.subscribe((i) -> testStreamList.forEach(testStream -> {
            try {
                generateTestStream(testStream, UUID);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }));
 Flux<List<TestStream>> transactionFlux = Flux.fromStream(Stream.generate(() -> testStreamList));
 return Flux.zip(interval, transactionFlux).map(Tuple2::getT2);

1 Ответ

0 голосов
/ 03 апреля 2020

Я обнаружил, что org.springframework.http.codec.ServerSentEvent, который можно подключить к вашему ответу Flux от контроллера остальных.

  Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));    
  Flux<HeapStat> transactionFlux = Flux.fromStream(Stream.generate(() -> heapStat));

  /*Bulding ServerSentEvent to from the tuple*/

  return Flux.zip(interval, transactionFlux).map(tuple->
           ServerSentEvent.<HeapStat>builder().event(jsessionId).data(tuple.getT2()).build()
                );

Вы можете подготовить ответ точно так же, как SSEEmmiter с пользовательским именем события, Last-Event- ID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...