簡體   English   中英

Spring Boot MVC 中 SSE 上的單播消息

[英]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 的地圖。

SSE Emitter:管理超時和完成()

我會正確測試並在這里更新

您可以利用與 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM