我有一个用例,需要向Android或IOS客户端发送推送通知。通知事件应该是单播。每条消息仅与单个客户端相关。
我怎样才能做到这一点?我以前使用如下代码向多个客户端广播事件。我想向事件特定的订阅者发送通知,该订阅服务器的事件属于SSE。
@GetMapping("/sse-emitter")
public SseEmitter sseEmitter() {
SseEmitter emitter = new SseEmitter();
Executors.newSingleThreadExecutor().execute(() -> {
try {
for (int i = 0; true; i++) {
SseEmitter.SseEventBuilder event = SseEmitter.event()
.id(String.valueOf(i))
.name("SSE_EMITTER_EVENT")
.data("SSE EMITTER - " + LocalTime.now().toString());
emitter.send(event);
Thread.sleep(1000);
}
} catch (Exception ex) {
emitter.completeWithError(ex);
}
});
return emitter;
}
我使用这种方法保存SSEEmitters的地图。
我会对它进行正确的测试并在这里进行更新
发布于 2022-07-19 12:48:14
您可以利用Spring兼容的SSE事件总线库将客户端映射到唯一的id。这样你以后就能区分它们了。
那篇好文章 @Pankaj的一部分在评论中留下
..。库创建一个SseEventBus类型的bean,应用程序可以将其注入到任何中。
@Controller
public class SseController {
private final SseEventBus eventBus;
public SseController(SseEventBus eventBus) {
this.eventBus = eventBus;
}
@GetMapping("/register/{id}")
public SseEmitter register(@PathVariable("id") String id) {
return this.eventBus.createSseEmitter(id, SseEvent.DEFAULT_EVENT)
}
}
库要求每个客户端发送一个唯一的id。应用程序可以使用像https://github.com/uuidjs/uuid这样的UUID库创建这样的id。为了启动SSE连接,客户端使用createSseEmitter方法调用端点,并发送他感兴趣的事件的id和(可选)名称。
const uuid = uuid();
const eventSource = new EventSource(`/register/${uuid}`);
eventSource.addEventListener('message', response => {
//handle the response from the server
//response.data contains the data line
}, false);
https://stackoverflow.com/questions/69828862
复制相似问题