refactor(sse): 优化 SseEmitterEndpoint 确保在 onCompletion、onTimeout 和 onError 时清理 SseEmitter。

同时,将 `SecurityUtils.getUser().getId()` 提取为局部变量 `userId`,减少重复代码。

在 `SseEmitterHolder` 中,修改了 `removeSseEmitter` 方法的参数类型和实现,使其直接通过 `SseEmitter` 对象进行删除,提升代码可读性和维护性。

此外,移除了 `SseEmitterMessageSender` 中未使用的 `ReflectUtil` 导入,保持代码简洁。
This commit is contained in:
冷冷 committed 2025-03-09 21:35:25 +08:00
1 parent b4f1b0c3c4
commit 7f740d9828
3 files changed
+15 -8

No files matched your search

@@ -30,17 +30,25 @@ public class SseEmitterEndpoint {
log.debug("MSG: SseConnectError");
return null;
}
Long userId = SecurityUtils.getUser().getId();
log.info("MSG: SseConnect | EmitterHash: {} | ID: {}", sseEmitter.hashCode(), SecurityUtils.getUser().getId());
sseEmitter.onCompletion(() -> {
log.info("MSG: SseConnectCompletion | EmitterHash: {} |ID: {}", sseEmitter.hashCode(), SecurityUtils.getUser().getId());
log.info("MSG: SseConnectCompletion | EmitterHash: {} |ID: {}", sseEmitter.hashCode(),
SecurityUtils.getUser().getId());
SseEmitterHolder.removeSseEmitter(sseEmitter);
});
sseEmitter.onTimeout(() -> {
log.error("MSG: SseConnectTimeout | EmitterHash: {} |ID: {} ", sseEmitter.hashCode(), SecurityUtils.getUser().getId());
log.error("MSG: SseConnectTimeout | EmitterHash: {} |ID: {} ", sseEmitter.hashCode(),
SecurityUtils.getUser().getId());
SseEmitterHolder.removeSseEmitter(sseEmitter);
});
sseEmitter.onError(t -> {
log.error("MSG: SseConnectError | EmitterHash: {} |ID: {}", sseEmitter.hashCode(), SecurityUtils.getUser().getId());
log.error("MSG: SseConnectError | EmitterHash: {} |ID: {}", sseEmitter.hashCode(),
SecurityUtils.getUser().getId());
SseEmitterHolder.removeSseEmitter(sseEmitter);
});
SseEmitterHolder.addSseEmitter(SecurityUtils.getUser().getId(), sseEmitter);
SseEmitterHolder.addSseEmitter(userId, sseEmitter);
sseEmitter.send("pong");
return sseEmitter;
}
@@ -1,6 +1,5 @@
package com.pig4cloud.pigx.common.sse.config;
import cn.hutool.core.util.ReflectUtil;
import com.pig4cloud.pigx.common.sse.holder.SseEmitterHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@@ -31,10 +31,10 @@ public final class SseEmitterHolder {
/**
* 删除一个 sseEmitter
* @param sseEmitterKey sseEmitter唯一标识
* @param sseEmitter SseEmitter
*/
public static void removeSseEmitter(Object sseEmitterKey) {
USER_SSE_EMITTER_MAP.remove(sseEmitterKey.toString());
public static void removeSseEmitter(SseEmitter sseEmitter) {
USER_SSE_EMITTER_MAP.values().remove(sseEmitter);
}
/**