SSE不同的客户端接收消息



我正在用SpringMVC编写一个信使,我希望那个在线的用户可以从服务器接收消息。我找到它的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有点像单行道。对于双向通信,我认为你需要其他东西,比如网络套接字,但我想你可以做以下事情:

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

另一个选项:

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

最新更新