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 街道。对于双向通信,我认为您需要其他类似网络套接字的东西,但我想您可以执行以下操作:
- 当客户端第一次联系时,将其 ID 传递给服务器。
- 服务器在其发送循环中跟踪该 ID 及其发送给该客户端的所有消息。我认为这不能保证客户端收到消息,但也许已经足够了。
- 如果出现异常(通常是因为连接关闭),客户端可能没有收到消息。
另一个选项:
我想你也可以让客户端记录它收到的所有消息,并在收到时一条一条地报告,或者稍后批量报告。但是,那时我开始怀疑是否没有现有的同步解决方案可以为您处理此问题。
我正在用 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 街道。对于双向通信,我认为您需要其他类似网络套接字的东西,但我想您可以执行以下操作:
- 当客户端第一次联系时,将其 ID 传递给服务器。
- 服务器在其发送循环中跟踪该 ID 及其发送给该客户端的所有消息。我认为这不能保证客户端收到消息,但也许已经足够了。
- 如果出现异常(通常是因为连接关闭),客户端可能没有收到消息。
另一个选项:
我想你也可以让客户端记录它收到的所有消息,并在收到时一条一条地报告,或者稍后批量报告。但是,那时我开始怀疑是否没有现有的同步解决方案可以为您处理此问题。