【修复】解决停止项目时ws报错、启动时因为日志配置过时的写法报红色警告

This commit is contained in:
俞宝山
2026-02-07 21:53:47 +08:00
parent d85e080643
commit 0cded6758a
2 changed files with 48 additions and 1 deletions

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import jakarta.annotation.PreDestroy;
import jakarta.websocket.*; import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint; import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -12,12 +13,14 @@ import org.springframework.stereotype.Component;
import vip.xiaonuo.dev.modular.message.service.DevMessageService; import vip.xiaonuo.dev.modular.message.service.DevMessageService;
import java.io.IOException; import java.io.IOException;
import java.nio.channels.ClosedChannelException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
/** /**
* 站内信WebSocket * 站内信WebSocket
@@ -40,6 +43,31 @@ public class DevMessageWebSocket {
*/ */
private static final ConcurrentHashMap<String, String> SESSION_USER_MAP = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, String> SESSION_USER_MAP = new ConcurrentHashMap<>();
/**
* 应用关闭标志
*/
private static final AtomicBoolean IS_SHUTTING_DOWN = new AtomicBoolean(false);
/**
* 应用关闭时优雅关闭所有WebSocket连接
*/
@PreDestroy
public void destroy() {
IS_SHUTTING_DOWN.set(true);
log.info("应用关闭开始清理WebSocket连接当前连接数: {}", SESSION_POOL.size());
SESSION_POOL.values().forEach(session -> {
try {
if (session.isOpen()) {
session.close(new CloseReason(CloseReason.CloseCodes.GOING_AWAY, "服务器关闭"));
}
} catch (Exception e) {
// 忽略关闭时的异常
}
});
SESSION_POOL.clear();
SESSION_USER_MAP.clear();
}
@OnOpen @OnOpen
public void onOpen(Session session) { public void onOpen(Session session) {
try { try {
@@ -82,10 +110,29 @@ public class DevMessageWebSocket {
@OnError @OnError
public void onError(Session session, Throwable error) { public void onError(Session session, Throwable error) {
// 应用关闭时或通道已关闭时,忽略相关异常
if (IS_SHUTTING_DOWN.get() || isClosedException(error)) {
onClose(session);
return;
}
log.error("WebSocket onError", error); log.error("WebSocket onError", error);
onClose(session); onClose(session);
} }
/**
* 判断是否为关闭相关的异常
*/
private boolean isClosedException(Throwable error) {
if (error instanceof ClosedChannelException) {
return true;
}
if (error instanceof IOException) {
Throwable cause = error.getCause();
return cause instanceof ClosedChannelException;
}
return false;
}
@OnMessage @OnMessage
public void onMessage(String message, Session session) { public void onMessage(String message, Session session) {
// 收到消息,暂不处理 // 收到消息,暂不处理

View File

@@ -5,7 +5,7 @@
<include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 注册自定义转换器 --> <!-- 注册自定义转换器 -->
<conversionRule conversionWord="tid" converterClass="vip.xiaonuo.common.aspect.CustomTraceIdConverter" /> <conversionRule conversionWord="tid" class="vip.xiaonuo.common.aspect.CustomTraceIdConverter" />
<!-- 定义自定义日志格式 --> <!-- 定义自定义日志格式 -->
<property name="CUSTOM_LOG_PATTERN" <property name="CUSTOM_LOG_PATTERN"