Я хочу использовать Spring Webflux с Server Sent Events и Netty. Я был в состоянии получать события на стороне клиента. Но когда происходит много событий одно за другим, и клиент отменяет подписку, сервер отправляет больше событий, а клиент не получает их.
Хронология:
0 - Server checks if the downstream cancelled. It is not cancelled and the server sends event A
1 - Client receives event A
3 - Client closes SSE connection
4 - Server checks if the downstream cancelled. It is actually cancelled, but server does not detect it and sends event B
5 - Server checks if the downstream cancelled. It is actually cancelled, and server detects it and does not send event C
Проблема в том, что я не могу быть уверен, было ли доставлено событие B или нет, потому что в данный момент в отправленном сообщении нет свидетельств о закрытом соединении. Итак, вопрос в том, как мне избежать такой ситуации? Как я могу узнать, доставлено ли сообщение или действительно ли открыто соединение в момент отправки сообщения?
Это мой контроллер:
@GetMapping
public Flux<ServerSentEvent> stream() {
return Flux.<ServerSentEvent>push(emitter -> {
long counter = 0;
while (!emitter.isCancelled()) {
emitter.next(ServerSentEvent.builder(++counter).build());
System.out.println(counter);
}
}, OverflowStrategy.ERROR);
}
Это хвост клиентского журнала. :
...
data:212
data:213
data:214
Это хвост сервера журнала:
...
213
214
215
216