actor_mailbox.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package mhayaActor
  2. import (
  3. "time"
  4. creflect "github.com/mhaya/extend/reflect"
  5. cfacade "github.com/mhaya/facade"
  6. clog "github.com/mhaya/logger"
  7. )
  8. type mailbox struct {
  9. queue // queue
  10. name string // 邮箱名
  11. funcMap map[string]*creflect.FuncInfo // 已注册的函数
  12. }
  13. func newMailbox(name string) mailbox {
  14. return mailbox{
  15. queue: newQueue(),
  16. name: name,
  17. funcMap: make(map[string]*creflect.FuncInfo),
  18. }
  19. }
  20. func (p *mailbox) Register(funcName string, fn interface{}) {
  21. if funcName == "" || len(funcName) < 1 {
  22. clog.Errorf("[%s] Func name is empty.", fn)
  23. return
  24. }
  25. funcInfo, err := creflect.GetFuncInfo(fn)
  26. if err != nil {
  27. clog.Errorf("funcName = %s, err = %v", funcName, err)
  28. return
  29. }
  30. if _, found := p.funcMap[funcName]; found {
  31. clog.Errorf("funcName = %s, already exists.", funcName)
  32. return
  33. }
  34. p.funcMap[funcName] = &funcInfo
  35. }
  36. func (p *mailbox) GetFuncInfo(funcName string) (*creflect.FuncInfo, bool) {
  37. funcInfo, found := p.funcMap[funcName]
  38. return funcInfo, found
  39. }
  40. func (p *mailbox) Pop() *cfacade.Message {
  41. v := p.queue.Pop()
  42. if v == nil {
  43. return nil
  44. }
  45. msg, ok := v.(*cfacade.Message)
  46. if !ok {
  47. clog.Warnf("Convert to *Message fail. v = %+v", v)
  48. return nil
  49. }
  50. return msg
  51. }
  52. func (p *mailbox) Push(m *cfacade.Message) {
  53. if m != nil {
  54. m.PostTime = time.Now().UnixMilli()
  55. p.queue.Push(m)
  56. }
  57. }
  58. func (p *mailbox) onStop() {
  59. for key := range p.funcMap {
  60. delete(p.funcMap, key)
  61. }
  62. p.queue.Destroy()
  63. }