From 7f174ff87edae39a7f0b6f480de68738f01b46a2 Mon Sep 17 00:00:00 2001
From: pengm <674192343@qq.com>
Date: Tue, 3 Feb 2026 14:59:32 +0800
Subject: [PATCH] 1.修复websoket内存泄漏问题
---
src/components/Common/CommonTable/index.js | 6 +++---
src/models/app.js | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 85 insertions(+), 16 deletions(-)
diff --git a/src/components/Common/CommonTable/index.js b/src/components/Common/CommonTable/index.js
index c981e9c..139dc6c 100644
--- a/src/components/Common/CommonTable/index.js
+++ b/src/components/Common/CommonTable/index.js
@@ -4779,7 +4779,7 @@ class CommonTableRc extends React.Component {
const processIcon = true; /* 工序操作 */
/* 获取choose的props */
const chooseProcessProps = { ...this.getChooseProcessPropsTableRow(), disabled: false };
- console.log("🚀 ~ CommonTableRc ~ processIcon:", processIcon)
+
/** 放置选择材料图标 */
if (materialIcon) {
const setMaterial = commonFunc.showMessage(
@@ -4816,7 +4816,7 @@ class CommonTableRc extends React.Component {
tableData: props.data
})
: props.tableBtnsConfig || [];
-
+
return (
{
if (
commonUtils.isNotEmptyObject(this.props.tableProps.chooseProcessConfigRow)
- ) {
+ ) {
const iIndex = this.props.tableProps.chooseProcessConfigRow;
console.log("🚀 ~ CommonTableRc ~ this.props.tableProps:", this.props)
this.props.onBtnChoose("process", "BtnChooseProcess", iIndex);
diff --git a/src/models/app.js b/src/models/app.js
index 9763d89..eff22e9 100644
--- a/src/models/app.js
+++ b/src/models/app.js
@@ -592,6 +592,46 @@ export default {
url = `${config.ws_host}websocket/${userinfo.sId}?reStart=true&createTime=${new Date().getTime()}&sLoginType=${userinfo.sUserLoginType}`;
}
}
+ // 清理旧的WebSocket连接和定时器
+ let oldWebSocket = yield select(state => state.app.webSocket);
+ if (oldWebSocket) {
+ console.log('发现旧的WebSocket连接,准备清理:', oldWebSocket);
+ console.log('旧WebSocket连接状态:', oldWebSocket.readyState);
+ try {
+ // 移除所有事件监听器
+ oldWebSocket.onopen = null;
+ oldWebSocket.onclose = null;
+ oldWebSocket.onerror = null;
+ oldWebSocket.onmessage = null;
+ oldWebSocket.onmessageTmp = null;
+ oldWebSocket.homeAction = null;
+
+ // 关闭连接
+ if (oldWebSocket.readyState === WebSocket.OPEN || oldWebSocket.readyState === WebSocket.CONNECTING) {
+ oldWebSocket.close(1000, '正常关闭,准备重连');
+ console.log('已关闭旧的WebSocket连接');
+ }
+ // 断开引用,帮助垃圾回收
+ oldWebSocket = null;
+ console.log('旧WebSocket连接已彻底清理');
+ } catch (error) {
+ console.log('关闭旧WebSocket连接时出错:', error);
+ }
+ } else {
+ console.log('没有发现旧的WebSocket连接');
+ }
+
+ // 清除所有定时器
+ clearTimeout(window.wsTimer);
+ clearTimeout(config.timerServer);
+ clearTimeout(config.serverTimer);
+ window.wsTimer = null;
+ config.timerServer = null;
+ config.serverTimer = null;
+
+ // 清理全局变量
+ window.wsHistoryArgs = undefined;
+ window.onmessageTmp = undefined;
const reset = (ws, config1) => {
clearTimeout(config1.timerServer);
clearTimeout(config1.serverTimer);
@@ -613,10 +653,17 @@ export default {
// 3s内没返回消息,则重新创建ws,重新发送
clearTimeout(window.wsTimer);
window.wsTimer = setTimeout(() => {
- console.log('================超时未收到WebSocket消息,重新创建ws并发送信息======================');
- window.wsHistoryArgs = args;
- ws.onmessageTmp && (window.onmessageTmp = ws.onmessageTmp);
- dispatch({ type: 'app/createWebSocket', payload: { reStart: true, dispatch } });
+ // 检查当前WebSocket连接状态
+ if (ws && ws.readyState === WebSocket.OPEN) {
+ console.log('================WebSocket连接正常但超时未收到消息,重新发送信息======================');
+ // 先尝试重新发送消息,而不是直接创建新连接
+ ws.originalSend.apply(ws, args);
+ } else {
+ console.log('================超时未收到WebSocket消息,重新创建ws并发送信息======================');
+ window.wsHistoryArgs = args;
+ ws.onmessageTmp && (window.onmessageTmp = ws.onmessageTmp);
+ dispatch({ type: 'app/createWebSocket', payload: { reStart: true, dispatch } });
+ }
}, 3000);
}
ws.originalSend.apply(ws, args);
@@ -630,24 +677,16 @@ export default {
ws.onmessageTmp = window.onmessageTmp;
window.onmessageTmp = undefined;
}
+ clearTimeout(config1.timerServer);
config1.timerServer = setTimeout(() => {
const message = { sendFrom: userinfo.sId, connectTest: 'test' }; // param 存放其它参数 keyName 需要放入Redis的数据key,keyValue 需要放入Redis的数据key 的值
ws.send(JSON.stringify(message));
}, config1.timeoutServer);
};
- const oldWebSocket = yield select(state => state.app.webSocket);
const ws = new WebSocket(url);
ws.onopen = function (e) {
console.log('连接上 webscoket 服务端了', e);
start(ws, config);
- if (oldWebSocket && oldWebSocket !== ws) {
- try {
- oldWebSocket.close();
- console.log('================已关闭旧的WebSocket连接======================');
- } catch (error) {
- console.log('================关闭旧WebSocket连接时出错======================', error);
- }
- }
};
// 全局通用的自定义onmessage的方法
ws.homeAction = msg => {
@@ -733,10 +772,40 @@ export default {
ws.onclose = (e) => {
/* 当客户端收到服务器端发送关闭请求,触发onclose事件 */
console.log('webscoket关闭!!', e);
+ // 清理定时器
+ clearTimeout(window.wsTimer);
+ clearTimeout(config.timerServer);
+ clearTimeout(config.serverTimer);
+ window.wsTimer = null;
+ config.timerServer = null;
+ config.serverTimer = null;
+ console.log('3', e);
+
+ // 自动重连
+ if (e.code !== 1000) { // 非正常关闭
+ console.log('WebSocket非正常关闭,将在5秒后尝试重连');
+ setTimeout(() => {
+ dispatch({ type: 'app/createWebSocket', payload: { reStart: true, dispatch } });
+ }, 5000);
+ }
};
ws.onerror = (e) => {
/* 如果出现连接、处理、接收、发送数据异常 触发onerror */
console.log('webscoket异常!!', e);
+ // 清理定时器
+ clearTimeout(window.wsTimer);
+ clearTimeout(config.timerServer);
+ clearTimeout(config.serverTimer);
+ window.wsTimer = null;
+ config.timerServer = null;
+ config.serverTimer = null;
+ console.log('4', e);
+
+ // 自动重连
+ console.log('WebSocket出现异常,将在5秒后尝试重连');
+ setTimeout(() => {
+ dispatch({ type: 'app/createWebSocket', payload: { reStart: true, dispatch } });
+ }, 5000);
};
yield put({ type: 'saveWebSocket', payload: { webSocket: ws } });
},
--
libgit2 0.22.2