1.删除无用配置

2.Sse 添加心跳机制
This commit is contained in:
2025-07-18 19:04:33 +08:00
parent 4cd6ea0c3f
commit 0fbb59b18e
2 changed files with 23 additions and 22 deletions

View File

@@ -8,7 +8,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.*;
import java.util.function.Consumer;
/**
@@ -16,7 +16,8 @@ import java.util.function.Consumer;
*/
@Slf4j
public class SseEmitterUtil {
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
/**
* 使用map对象便于根据userId来获取对应的SseEmitter或者放redis里面
*/
@@ -25,16 +26,30 @@ public class SseEmitterUtil {
public static SseEmitter connect(String userId) {
// 设置超时时间0表示不过期。默认30S超时时间未完成会抛出异常AsyncRequestTimeoutException
SseEmitter sseEmitter = new SseEmitter(0L);
// 设置超时时间为0表示永不超时或设置为较长的时间
// 注册回调
sseEmitter.onCompletion(completionCallBack(userId));
sseEmitter.onError(errorCallBack(userId));
sseEmitter.onTimeout(timeoutCallBack(userId));
sseEmitterMap.put(userId, sseEmitter);
log.info("创建新的 SSE 连接,当前用户 {}, 连接总数 {}", userId, sseEmitterMap.size());
// 启动一个任务定期发送心跳
ScheduledFuture<?> heartbeat = scheduler.scheduleAtFixedRate(() -> {
try {
// 发送心跳注释,防止代理或浏览器断开
sseEmitter.send(SseEmitter.event().comment("heartbeat"));
} catch (IOException e) {
sseEmitter.completeWithError(e);
}
}, 0, 10, TimeUnit.SECONDS); // 每10秒一次
return sseEmitter;
}
/**
* 给制定用户发送消息
@@ -113,6 +128,10 @@ public class SseEmitterUtil {
public static SseEmitter getSseEmitter(String userId) {
return sseEmitterMap.get(userId);
}
private static Runnable completionCallBack(String userId) {
return () -> {

View File

@@ -83,24 +83,6 @@ knife4j:
api-rule-resources:
- com.yupi.springbootinit.controller
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: vvtoken
# token 有效期(单位:秒) 默认30天-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: false
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token
is-share: false
# token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik
token-style: random-128
# 是否输出操作日志
is-log: true
logging:
level:
org.mybatis: off