|
@@ -27,10 +27,12 @@ type WebSocketConn struct {
|
|
wg sync.WaitGroup
|
|
wg sync.WaitGroup
|
|
sendChan chan []byte
|
|
sendChan chan []byte
|
|
closeChan chan struct{}
|
|
closeChan chan struct{}
|
|
|
|
+ monitorHandlers []func(adminId int)(err error)
|
|
|
|
+ adminId int
|
|
}
|
|
}
|
|
|
|
|
|
// NewConnection 创建一个新的连接对象
|
|
// NewConnection 创建一个新的连接对象
|
|
-func NewWebSocketConn(conn *websocket.Conn, id string, adminId int) *WebSocketConn {
|
|
|
|
|
|
+func NewWebSocketConn(conn *websocket.Conn, id string, adminId int, monitorHandlers []func(adminId int)(err error)) *WebSocketConn {
|
|
WebSocketConnAdminIdMap[id] = adminId
|
|
WebSocketConnAdminIdMap[id] = adminId
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
webSocketConn := &WebSocketConn{
|
|
webSocketConn := &WebSocketConn{
|
|
@@ -40,8 +42,10 @@ func NewWebSocketConn(conn *websocket.Conn, id string, adminId int) *WebSocketCo
|
|
cancel: cancel,
|
|
cancel: cancel,
|
|
sendChan: make(chan []byte, 100), // 发送消息的缓冲通道
|
|
sendChan: make(chan []byte, 100), // 发送消息的缓冲通道
|
|
closeChan: make(chan struct{}),
|
|
closeChan: make(chan struct{}),
|
|
|
|
+ adminId: adminId,
|
|
}
|
|
}
|
|
AdminWebSocketConnMap[adminId] = webSocketConn
|
|
AdminWebSocketConnMap[adminId] = webSocketConn
|
|
|
|
+ webSocketConn.monitorHandlers = monitorHandlers
|
|
return webSocketConn
|
|
return webSocketConn
|
|
}
|
|
}
|
|
|
|
|
|
@@ -56,6 +60,12 @@ func (c *WebSocketConn) Start() {
|
|
// 启动写协程
|
|
// 启动写协程
|
|
c.wg.Add(1)
|
|
c.wg.Add(1)
|
|
go c.writeLoop()
|
|
go c.writeLoop()
|
|
|
|
+
|
|
|
|
+ if len(c.monitorHandlers) > 0 {
|
|
|
|
+ // 启动消息监听协程
|
|
|
|
+ c.wg.Add(1)
|
|
|
|
+ go c.MonitorMessageHandler(c.adminId)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// Close 关闭连接并清理资源
|
|
// Close 关闭连接并清理资源
|
|
@@ -152,6 +162,24 @@ func (c *WebSocketConn) writeLoop() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func (c *WebSocketConn) MonitorMessageHandler(adminId int) {
|
|
|
|
+ defer c.wg.Done()
|
|
|
|
+ defer utils.FileLog.Info("客户端 %s 的消息监控协程已退出", c.id)
|
|
|
|
+ for {
|
|
|
|
+ select {
|
|
|
|
+ case <-c.ctx.Done():
|
|
|
|
+ return
|
|
|
|
+ default:
|
|
|
|
+ time.Sleep(time.Second * 10)
|
|
|
|
+ for _, handler := range c.monitorHandlers {
|
|
|
|
+ utils.FileLog.Info("处理注册的消息监控函数")
|
|
|
|
+ handler(c.adminId)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
var (
|
|
var (
|
|
EDB_MONITOR_MESSAGE_CONNECT_CACHE = "edb_monitor_message_cache:"
|
|
EDB_MONITOR_MESSAGE_CONNECT_CACHE = "edb_monitor_message_cache:"
|
|
)
|
|
)
|