|
@@ -2,13 +2,16 @@ package com.backendsys.modules.sse.emitter;
|
|
|
|
|
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
|
|
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
|
|
|
public class SseEmitterManager {
|
|
|
// 单例实例
|
|
|
private static final SseEmitterManager INSTANCE = new SseEmitterManager();
|
|
|
// 存储SseEmitter的线程安全列表
|
|
|
- public final CopyOnWriteArrayList<SseEmitter> emitters = new CopyOnWriteArrayList<>();
|
|
|
+// public final CopyOnWriteArrayList<Long, SseEmitter> emitters = new CopyOnWriteArrayList<>();
|
|
|
+ public final ConcurrentHashMap<String, SseEmitter> emitters = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
// 私有构造函数,防止外部直接实例化
|
|
|
private SseEmitterManager() {}
|
|
|
// 公共静态方法,获取单例实例
|
|
@@ -16,13 +19,18 @@ public class SseEmitterManager {
|
|
|
return INSTANCE;
|
|
|
}
|
|
|
// 公共方法,供外部添加SseEmitter
|
|
|
- public void addEmitter(SseEmitter emitter) {
|
|
|
- this.emitters.add(emitter);
|
|
|
+ public void addEmitter(String userId, SseEmitter emitter) {
|
|
|
+ this.emitters.put(userId, emitter);
|
|
|
emitter.onTimeout(() -> this.emitters.remove(emitter));
|
|
|
emitter.onCompletion(() -> this.emitters.remove(emitter));
|
|
|
}
|
|
|
// 公共方法,供外部移除SseEmitter
|
|
|
+ public SseEmitter getEmitter(String userId) {
|
|
|
+ // 根据用户ID获取 SseEmitter
|
|
|
+ return this.emitters.get(userId);
|
|
|
+ }
|
|
|
+ // 公共方法,供外部移除SseEmitter
|
|
|
public void removeEmitter(SseEmitter emitter) {
|
|
|
this.emitters.remove(emitter);
|
|
|
}
|
|
|
-}
|
|
|
+}
|