msg_bus.go 924 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package service
  2. import (
  3. "github.com/sirupsen/logrus"
  4. "sportfitness/base/assembly/base/model"
  5. "sync"
  6. )
  7. var msgBusDataMap = map[int]chan model.Msg{}
  8. var msgBusDataMapMu = sync.Mutex{}
  9. type MsgBus struct {
  10. }
  11. func (m MsgBus) AddListener(userId int) (channelOut <-chan model.Msg) {
  12. msgBusDataMapMu.Lock()
  13. defer msgBusDataMapMu.Unlock()
  14. channel := make(chan model.Msg, 10)
  15. msgBusDataMap[userId] = channel
  16. channelOut = channel
  17. return
  18. }
  19. func (m MsgBus) RemoveListener(userId int) {
  20. msgBusDataMapMu.Lock()
  21. defer msgBusDataMapMu.Unlock()
  22. if c, ok := msgBusDataMap[userId]; ok {
  23. close(c)
  24. }
  25. delete(msgBusDataMap, userId)
  26. }
  27. func (MsgBus) SendMsg(msg model.Msg) {
  28. msgBusDataMapMu.Lock()
  29. defer msgBusDataMapMu.Unlock()
  30. if channel, ok := msgBusDataMap[msg.UserIdRcv]; ok {
  31. select {
  32. case channel <- msg:
  33. break
  34. default:
  35. logrus.Errorf("向用户ID[%d]发送信息失败,chan满", msg.UserIdRcv)
  36. }
  37. }
  38. }