SSE 连接每 5 分钟失败一次

SSE connection keeps failing every 5 minutes

我正在使用 SseEmitter Spring API 公开一个简单的 SSE 端点,将所有发射器保持在 ConcurrentHashMap 中。每个发射器的超时设置为 24 小时。每隔 10 秒,我就会向所有客户发送一条消息。客户端订阅本机 EventSource 实现,监听特定名称的事件。

不幸的是,我注意到连接每 5 分钟就会断开并重新建立 - 即使发射器的超时已明确设置为 24 小时。客户端确实将其记录为错误,但在服务器端却什么也没有。 Tomcat 和 Jetty 都会出现此问题。我想保持会话打开而不受任何干扰,因此每 5 分钟重置一次连接是不可接受的。知道为什么会发生这种情况吗?

@RestController
@RequestMapping("api/v1/sse")
class SseController {

  private val emitters = ConcurrentHashMap<String, SseEmitter>()

  @GetMapping
  fun initConnection(@RequestParam token: String): SseEmitter {
    logger.info { "Init connection from $token" }
    val emitter = SseEmitter(24 * 60 * 60 * 1000)
    emitter.onCompletion {
      logger.info { "Completion" }
      emitters.remove(token)
    }
    emitter.onTimeout { logger.info { "Timeout " } }
    emitter.onError { logger.error(it) { "Error" } }
    emitters[token] = emitter
    return emitter
  }

  @Scheduled(fixedRate = 10000)
  fun send() {
    emitters.forEach { (k, v) ->
      logger.info { "Sending message to $k" }
      v.send(
        SseEmitter.event()
          .id(UUID.randomUUID().toString())
          .name("randomEvent")
          .data("some data")
      )
    }
  }
}
const eventSource = new EventSource(url);

eventSource.addEventListener('randomEvent', (e) =>
  console.log(e.data)
);

eventSource.onerror = (e) => console.log(e);

好的,这似乎是 Stackblitz 的服务工作者的问题。我刚刚在 Chrome 的普通控制台中实施了相同的 client-side 解决方案,并且不再发生断开连接。