【问题标题】:SSE different client receive messagesSSE不同客户端接收消息
【发布时间】:2020-10-09 21:15:20
【问题描述】:

我正在用 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;
}

【问题讨论】:

    标签: java spring spring-mvc server-sent-events


    【解决方案1】:

    SSE 是一种单行道。对于双向通信,我认为您需要其他东西,例如网络套接字,但我想您可以执行以下操作:

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

    另一种选择:

    我想您也可以让客户记录它收到的所有消息,并在收到时逐一报告或稍后作为批次报告。但是,我开始怀疑是否没有现有的同步解决方案可以为您处理这个问题。

    【讨论】: