package service import ( "sportfitness/base/assembly/base/model" "sync" "github.com/sirupsen/logrus" ) // 监听列表, key: userId var msgBusDataMap = map[int]chan model.Msg{} var msgBusDataMapMu = sync.Mutex{} type MsgBus struct { } func (m MsgBus) AddListener(userId int) (channelOut <-chan model.Msg) { msgBusDataMapMu.Lock() defer msgBusDataMapMu.Unlock() channel := make(chan model.Msg, 10) msgBusDataMap[userId] = channel channelOut = channel return } func (m MsgBus) RemoveListener(userId int) { msgBusDataMapMu.Lock() defer msgBusDataMapMu.Unlock() if c, ok := msgBusDataMap[userId]; ok { close(c) } delete(msgBusDataMap, userId) } func (MsgBus) SendMsg(msg model.Msg) { msgBusDataMapMu.Lock() defer msgBusDataMapMu.Unlock() if channel, ok := msgBusDataMap[msg.UserIdRcv]; ok { select { case channel <- msg: break default: logrus.Errorf("向用户ID[%d]发送信息失败,chan满", msg.UserIdRcv) } } //else { // 设备不在线时,可在此处理 //} }