fix: ws 处理 Panic 协程异常/协程处理消息结果

This commit is contained in:
TsMask
2024-02-04 10:53:10 +08:00
parent 1707d9ea3b
commit d032e5a67d
2 changed files with 25 additions and 17 deletions

View File

@@ -100,12 +100,6 @@ func (s *WSImpl) NewClient(uid string, groupIDs []string, conn *websocket.Conn)
} }
} }
defer func() {
// 在这里处理 Panic 协程异常
if err := recover(); err != nil {
logger.Errorf("ws Panic Error: %s => %v", clientID, err)
}
}()
go s.clientRead(wsClient) go s.clientRead(wsClient)
go s.clientWrite(wsClient) go s.clientWrite(wsClient)
@@ -120,6 +114,11 @@ func (s *WSImpl) NewClient(uid string, groupIDs []string, conn *websocket.Conn)
// clientRead 客户端读取消息 // clientRead 客户端读取消息
func (s *WSImpl) clientRead(wsClient *model.WSClient) { func (s *WSImpl) clientRead(wsClient *model.WSClient) {
defer func() {
if err := recover(); err != nil {
logger.Errorf("ws ReadMessage Panic Error: %v", err)
}
}()
for { for {
// 读取消息 // 读取消息
messageType, msg, err := wsClient.Conn.ReadMessage() messageType, msg, err := wsClient.Conn.ReadMessage()
@@ -138,12 +137,7 @@ func (s *WSImpl) clientRead(wsClient *model.WSClient) {
msgByte, _ := json.Marshal(result.ErrMsg("message format not supported")) msgByte, _ := json.Marshal(result.ErrMsg("message format not supported"))
wsClient.MsgChan <- msgByte wsClient.MsgChan <- msgByte
} else { } else {
err := NewWSReceiveImpl.Receive(wsClient, reqMsg) go NewWSReceiveImpl.Receive(wsClient, reqMsg)
if err != nil {
logger.Warnf("ws ReceiveMessage UID %s err: %s", wsClient.BindUid, err.Error())
msgByte, _ := json.Marshal(result.ErrMsg(err.Error()))
wsClient.MsgChan <- msgByte
}
} }
} }
} }
@@ -151,6 +145,11 @@ func (s *WSImpl) clientRead(wsClient *model.WSClient) {
// clientWrite 客户端写入消息 // clientWrite 客户端写入消息
func (s *WSImpl) clientWrite(wsClient *model.WSClient) { func (s *WSImpl) clientWrite(wsClient *model.WSClient) {
defer func() {
if err := recover(); err != nil {
logger.Errorf("ws WriteMessage Panic Error: %v", err)
}
}()
for msg := range wsClient.MsgChan { for msg := range wsClient.MsgChan {
// 发送消息 // 发送消息
err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg) err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg)

View File

@@ -1,8 +1,11 @@
package service package service
import ( import (
"encoding/json"
"fmt" "fmt"
"ems.agt/src/framework/logger"
"ems.agt/src/framework/vo/result"
"ems.agt/src/modules/ws/model" "ems.agt/src/modules/ws/model"
"ems.agt/src/modules/ws/processor" "ems.agt/src/modules/ws/processor"
) )
@@ -14,9 +17,13 @@ var NewWSReceiveImpl = &WSReceiveImpl{}
type WSReceiveImpl struct{} type WSReceiveImpl struct{}
// Receive 接收处理 // Receive 接收处理
func (s *WSReceiveImpl) Receive(client *model.WSClient, reqMsg model.WSRequest) error { func (s *WSReceiveImpl) Receive(client *model.WSClient, reqMsg model.WSRequest) {
if reqMsg.RequestID == "" { if reqMsg.RequestID == "" {
return fmt.Errorf("message requestId is required") msg := "message requestId is required"
logger.Warnf("ws ReceiveMessage UID %s err: %s", client.BindUid, msg)
msgByte, _ := json.Marshal(result.ErrMsg(msg))
client.MsgChan <- msgByte
return
} }
var resByte []byte var resByte []byte
@@ -36,12 +43,14 @@ func (s *WSReceiveImpl) Receive(client *model.WSClient, reqMsg model.WSRequest)
case "ne_state": case "ne_state":
resByte, err = processor.GetNeState(reqMsg.RequestID, reqMsg.Data) resByte, err = processor.GetNeState(reqMsg.RequestID, reqMsg.Data)
default: default:
return fmt.Errorf("message type not supported") err = fmt.Errorf("message type not supported")
} }
if err != nil { if err != nil {
return err logger.Warnf("ws ReceiveMessage UID %s err: %s", client.BindUid, err.Error())
msgByte, _ := json.Marshal(result.ErrMsg(err.Error()))
client.MsgChan <- msgByte
return
} }
client.MsgChan <- resByte client.MsgChan <- resByte
return nil
} }