update 优化 sse 删除之后 手动触发完成 防止内存泄漏

This commit is contained in:
疯狂的狮子Li 2025-03-31 09:41:46 +08:00
parent e71d6fa983
commit 124bcc4bba

View File

@ -39,14 +39,27 @@ public class SseEmitterManager {
Map<String, SseEmitter> emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()); Map<String, SseEmitter> emitters = USER_TOKEN_EMITTERS.computeIfAbsent(userId, k -> new ConcurrentHashMap<>());
// 创建一个新的 SseEmitter 实例超时时间设置为 0 表示无限制 // 创建一个新的 SseEmitter 实例超时时间设置为 0 表示无限制
SseEmitter emitter = new SseEmitter(0L); SseEmitter emitter = emitters.computeIfAbsent(token, k -> new SseEmitter(0L));
emitters.put(token, emitter);
// emitter 完成超时或发生错误时从映射表中移除对应的 token // emitter 完成超时或发生错误时从映射表中移除对应的 token
emitter.onCompletion(() -> emitters.remove(token)); emitter.onCompletion(() -> {
emitter.onTimeout(() -> emitters.remove(token)); SseEmitter remove = emitters.remove(token);
emitter.onError((e) -> emitters.remove(token)); if (remove != null) {
remove.complete();
}
});
emitter.onTimeout(() -> {
SseEmitter remove = emitters.remove(token);
if (remove != null) {
remove.complete();
}
});
emitter.onError((e) -> {
SseEmitter remove = emitters.remove(token);
if (remove != null) {
remove.complete();
}
});
try { try {
// 向客户端发送一条连接成功的事件 // 向客户端发送一条连接成功的事件
@ -106,7 +119,10 @@ public class SseEmitterManager {
.name("message") .name("message")
.data(message)); .data(message));
} catch (Exception e) { } catch (Exception e) {
emitters.remove(entry.getKey()); SseEmitter remove = emitters.remove(entry.getKey());
if (remove != null) {
remove.complete();
}
} }
} }
} else { } else {