[英]Unicast message over SSE in Spring Boot MVC
我有一個用例,我需要向 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;
}
PS 我正在使用這種方法來保存 SSEEmitters 的地圖。
我會正確測試並在這里更新
您可以利用與 Spring 兼容的SSE 事件總線庫將您的客戶端映射到唯一 ID。 以便您以后可以區分它們。
好文章的一部分@Pankaj Chimbalkar 在評論中留下
... 該庫創建一個 SseEventBus 類型的 bean,應用程序可以將其注入任何 Spring 管理的 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.