SSE不同客户端接收消息

SSE different client receive messages

我正在用 Spring MVC 写一个信使,我希望在线的用户可以从服务器接收消息。我找到它的 SSE 的最佳解决方案,建立了这个方法,但是如果所有活动(在线)用户都订阅了这个方法,服务器如何必须知道哪个用户应该收到这个消息?

@GetMapping("/stream-sse-mvc")
public SseEmitter streamSseMvc() {
    SseEmitter emitter = new SseEmitter();
    ExecutorService sseMvcExecutor = Executors.newSingleThreadExecutor();
    sseMvcExecutor.execute(() -> {
        try {
            for (int i = 0; true; i++) {
                SseEventBuilder event = SseEmitter.event()
                  .data("SSE MVC - " + LocalTime.now().toString())
                  .id(String.valueOf(i))
                  .name("sse event - mvc");
                emitter.send(event);
                Thread.sleep(1000);
            }
        } catch (Exception ex) {
            emitter.completeWithError(ex);
        }
    });
    return emitter;
}

SSE 有点像 one-way 街道。对于双向通信,我认为您需要其他类似网络套接字的东西,但我想您可以执行以下操作:

  1. 当客户端第一次联系时,将其 ID 传递给服务器。
  2. 服务器在其发送循环中跟踪该 ID 及其发送给该客户端的所有消息。我认为这不能保证客户端收到消息,但也许已经足够了。
  3. 如果出现异常(通常是因为连接关闭),客户端可能没有收到消息。

另一个选项:

我想你也可以让客户端记录它收到的所有消息,并在收到时一条一条地报告,或者稍后批量报告。但是,那时我开始怀疑是否没有现有的同步解决方案可以为您处理此问题。