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