From 2869d590e6ffeb6ab7ff66611e4b74fdddfa0ba7 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期四, 01 八月 2024 14:55:43 +0800
Subject: [PATCH] update 优化 sse 关闭连接各种异常问题

---
 ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java
index 4b56b69..aa7960c 100644
--- a/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java
+++ b/ruoyi-common/ruoyi-common-sse/src/main/java/org/dromara/common/sse/core/SseEmitterManager.java
@@ -1,5 +1,6 @@
 package org.dromara.common.sse.core;
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.redis.utils.RedisUtils;
@@ -30,6 +31,7 @@
 
         emitter.onCompletion(() -> emitters.remove(token));
         emitter.onTimeout(() -> emitters.remove(token));
+        emitter.onError((e) -> emitters.remove(token));
 
         try {
             emitter.send(SseEmitter.event().comment("connected"));
@@ -44,7 +46,7 @@
         if (emitters != null) {
             try {
                 emitters.get(token).send(SseEmitter.event().comment("disconnected"));
-            } catch (IOException ignore) {
+            } catch (Exception ignore) {
             }
             emitters.remove(token);
         }
@@ -70,9 +72,13 @@
         if (emitters != null) {
             for (Map.Entry<String, SseEmitter> entry : emitters.entrySet()) {
                 try {
+                    // token 鏃犳晥鎴栧凡杩囨湡
+                    if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(entry.getKey()) < -1) {
+                        emitters.remove(entry.getKey());
+                        continue;
+                    }
                     entry.getValue().send(SseEmitter.event()
                         .name("message")
-                        .reconnectTime(10000L)
                         .data(message));
                 } catch (Exception e) {
                     emitters.remove(entry.getKey());

--
Gitblit v1.9.3