SSE不同的客户端接收消息

问题描述

我正在用Spring MVC编写一个Messenger,我希望那个在线的用户可以从服务器接收消息。我找到了其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;
}

解决方法

上证所有点单向。对于双向通信,我认为您还需要Web套接字等其他功能,但是我想您可以执行以下操作:

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

另一个选项:

我想您也可以让客户端记录它收到的所有消息,并在收到后逐个报告,或者以后再成批报告。但是,我开始怀疑此时是否没有可以为您解决此问题的同步解决方案。