forked from davyxu/cellnet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmsgdispatcher.go
77 lines (56 loc) · 1.71 KB
/
msgdispatcher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package proc
import (
"github.com/davyxu/cellnet"
"reflect"
"sync"
)
// 消息派发器,可选件,兼容v3以前的注册及派发消息方式,在没有代码生成框架及工具时是较方便的接收处理接口
type MessageDispatcher struct {
handlerByType map[reflect.Type][]cellnet.EventCallback
handlerByTypeGuard sync.RWMutex
}
func (self *MessageDispatcher) OnEvent(ev cellnet.Event) {
msgType := reflect.TypeOf(ev.Message())
if msgType == nil {
return
}
self.handlerByTypeGuard.RLock()
handlers, ok := self.handlerByType[msgType.Elem()]
self.handlerByTypeGuard.RUnlock()
if ok {
for _, callback := range handlers {
callback(ev)
}
}
}
func (self *MessageDispatcher) Exists(msgName string) bool {
meta := cellnet.MessageMetaByFullName(msgName)
if meta == nil {
return false
}
self.handlerByTypeGuard.Lock()
defer self.handlerByTypeGuard.Unlock()
handlers, _ := self.handlerByType[meta.Type]
return len(handlers) > 0
}
func (self *MessageDispatcher) RegisterMessage(msgName string, userCallback cellnet.EventCallback) {
meta := cellnet.MessageMetaByFullName(msgName)
if meta == nil {
panic("message not found:" + msgName)
}
self.handlerByTypeGuard.Lock()
handlers, _ := self.handlerByType[meta.Type]
handlers = append(handlers, userCallback)
self.handlerByType[meta.Type] = handlers
self.handlerByTypeGuard.Unlock()
}
func NewMessageDispatcher() *MessageDispatcher {
return &MessageDispatcher{
handlerByType: make(map[reflect.Type][]cellnet.EventCallback),
}
}
func NewMessageDispatcherBindPeer(peer cellnet.Peer, processorName string) *MessageDispatcher {
self := NewMessageDispatcher()
BindProcessorHandler(peer, processorName, self.OnEvent)
return self
}