Flux.create() не генерирует события

#spring #spring-webflux #eventsource

#spring #spring-webflux #источник событий

Вопрос:

Я пытаюсь использовать Flux для генерации асинхронных событий, отправляемых сервером, с помощью Flux.create. Когда мой клиент подключается, время ожидания запроса в конечном итоге истекает, и событие никогда не получено. Я жестко запрограммировал событие, которое будет отправлено Flux.create, просто чтобы увидеть поток данных, но все равно ничего не получил на стороне клиента.

 @GetMapping(path = "/stream", headers = "Accept=*/*", consumes = MediaType.ALL_VALUE, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<PricingDTO>> getEventStream() {

  final Flux<ServerSentEvent<PricingDTO>> flux = Flux.<ServerSentEvent<PricingDTO>>create(emitter -> {
    final PricingDTO pricing = new PricingDTO();
    pricing.setId(99L);
    emitter.next(ServerSentEvent.builder(pricing).build());
  });

  return flux;
}
  

Клиентский (угловой) код:

 const eventSource = new EventSource(url);
eventSource.onmessage = (event) => {
  console.debug('Received event: '   event);
  const json = JSON.parse(event.data);
  // Should be PricingDTO record here
};

eventSource.onerror = (error) => {
  if (eventSource.readyState === EventSource.CLOSED) {
    console.log('The stream has been closed by the server.');
    eventSource.close();
  } else {
    console.log('Error here: '   error);
  }
};
  

Я никогда не вижу, чтобы событие проходило через EventSource. В конце концов время ожидания запроса истекает, и я вижу ошибку: net::ERR_EMPTY_RESPONSE

Я новичок в использовании WebFlux и подозреваю, что мне не хватает некоторой инициализации в потоке потока, прежде чем я верну результат потока. Я отладил и вижу, что мой веб-сервис получает запрос и возвращает объект Flux. Есть идеи, почему я не получаю свои события?

Ответ №1:

Ваш код webflux кажется прекрасным. Я протестировал это на следующем упрощенном примере (без ваших пользовательских классов).

 @SpringBootApplication
@RestController
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> getEventStream() {
        return Flux.create(emitter -> emitter.next("hi").next("hi2"));
    }
}
  

При подключении к steam в Chrome вы можете видеть, что события поступают просто отлично:

 data:hi

data:hi2
  

проблема либо заключается в вашем фильтре заголовка accept, либо на стороне клиента. Вы могли бы, конечно, проверить это, подключившись к вашему потоку в браузере (или, лучше, тест)