#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, либо на стороне клиента. Вы могли бы, конечно, проверить это, подключившись к вашему потоку в браузере (или, лучше, тест)