SSE服务器延迟检测到连接取消

问题描述 投票:0回答:1

我想将Spring Webflux与服务器发送事件和Netty一起使用。我能够在客户端接收事件。但是,当一个事件一个接一个的发生并且客户端取消订阅时,服务器将发送更多事件,而客户端则不会接收到它们。

С年代学:0-服务器检查连接是否打开。它是打开的,服务器发送事件A1-客户收到事件A3-客户端关闭连接4-服务器检查连接是否打开。它实际上是关闭的,但是服务器未检测到它并发送事件B5-服务器检查连接是否打开。它实际上是关闭的,服务器检测到它并且不发送事件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
netty spring-webflux server-sent-events spring-reactor
1个回答
1
投票

您应该尝试不使用try/catch,尤其是在反应性应用程序中不要使用Thread#sleep

@GetMapping
public Flux<ServerSentEvent> stream()  { 
    return Flux.interval(Duration.ofSeconds(1))
               .map(counter -> ServerSentEvent.builder(counter).build());
}

如果只想在一个时间间隔内生成事件,则可以使用interval功能来完成。

我建议您阅读Reactive文档,它的确非常有趣。

https://projectreactor.io/docs/core/release/reference/#getting-started

© www.soinside.com 2019 - 2024. All rights reserved.