wide/event/events.go

119 lines
2.6 KiB
Go
Raw Normal View History

2014-09-15 10:24:40 +04:00
// 事件处理.
package event
2014-09-15 14:03:52 +04:00
import "github.com/golang/glog"
2014-09-15 10:24:40 +04:00
const (
2014-10-28 19:04:46 +03:00
EvtCodeGOPATHNotFound = iota // 事件代码:找不到环境变量 $GOPATH
EvtCodeGOROOTNotFound // 事件代码:找不到环境变量 $GOROOT
EvtCodeGocodeNotFound // 事件代码:找不到 gocode
EvtCodeIDEStubNotFound // 事件代码:找不到 IDE stub
EvtCodeServerInternalError // 事件代码:服务器内部错误
2014-09-15 10:24:40 +04:00
)
2014-09-15 19:20:01 +04:00
// 事件队列最大长度.
2014-09-15 14:03:52 +04:00
const MaxQueueLength = 10
2014-09-15 19:20:01 +04:00
// 事件结构.
type Event struct {
2014-10-28 19:04:46 +03:00
Code int `json:"code"` // 事件代码
Sid string `json:"sid"` // 用户会话 id
Data interface{} `json:"data"` // 事件数据
2014-09-15 19:20:01 +04:00
}
2014-09-15 10:24:40 +04:00
// 全局事件队列.
2014-09-25 09:37:59 +04:00
//
2014-09-24 12:24:24 +04:00
// 入队的事件将分发到每个用户的事件队列中.
2014-10-28 19:04:46 +03:00
var EventQueue = make(chan *Event, MaxQueueLength)
2014-09-15 10:24:40 +04:00
// 用户事件队列.
2014-09-19 15:21:13 +04:00
type UserEventQueue struct {
2014-10-28 19:04:46 +03:00
Sid string // 关联的会话 id
Queue chan *Event // 队列
Handlers []Handler // 事件处理器集
2014-09-19 15:21:13 +04:00
}
2014-10-10 07:17:51 +04:00
// 事件队列集类型.
2014-09-19 15:21:13 +04:00
type Queues map[string]*UserEventQueue
2014-09-15 10:24:40 +04:00
2014-09-19 15:21:13 +04:00
// 用户事件队列集.
2014-09-25 09:37:59 +04:00
//
2014-09-19 15:21:13 +04:00
// <sid, *UserEventQueue>
var UserEventQueues = Queues{}
2014-09-15 19:20:01 +04:00
2014-09-15 10:24:40 +04:00
// 加载事件处理.
func Load() {
go func() {
2014-09-15 14:03:52 +04:00
for event := range EventQueue {
2014-10-28 19:04:46 +03:00
glog.V(5).Infof("收到全局事件 [%d]", event.Code)
2014-09-15 10:24:40 +04:00
// 将事件分发到每个用户的事件队列里
2014-09-15 14:03:52 +04:00
for _, userQueue := range UserEventQueues {
2014-10-28 19:04:46 +03:00
event.Sid = userQueue.Sid
2014-09-19 15:21:13 +04:00
userQueue.Queue <- event
2014-09-15 10:24:40 +04:00
}
}
}()
}
2014-09-15 14:03:52 +04:00
2014-09-19 15:21:13 +04:00
// 为用户队列添加事件处理器.
func (uq *UserEventQueue) AddHandler(handlers ...Handler) {
for _, handler := range handlers {
uq.Handlers = append(uq.Handlers, handler)
2014-09-15 14:03:52 +04:00
}
2014-09-19 15:21:13 +04:00
}
2014-09-15 14:03:52 +04:00
2014-09-19 15:21:13 +04:00
// 初始化一个用户事件队列.
func (ueqs Queues) New(sid string) *UserEventQueue {
q := ueqs[sid]
if nil != q {
glog.Warningf("Already exist a user queue in session [%s]", sid)
2014-09-15 14:03:52 +04:00
2014-09-19 15:21:13 +04:00
return q
2014-09-15 19:20:01 +04:00
}
2014-09-19 15:21:13 +04:00
q = &UserEventQueue{
Sid: sid,
2014-10-28 19:04:46 +03:00
Queue: make(chan *Event, MaxQueueLength),
2014-09-15 19:20:01 +04:00
}
2014-09-19 15:21:13 +04:00
ueqs[sid] = q
go func() { // 队列开始监听事件
2014-10-28 19:04:46 +03:00
for evt := range q.Queue {
glog.V(5).Infof("Session [%s] received a event [%d]", sid, evt.Code)
2014-09-15 19:20:01 +04:00
// 将事件交给事件处理器进行处理
2014-09-19 15:21:13 +04:00
for _, handler := range q.Handlers {
2014-10-28 19:04:46 +03:00
handler.Handle(evt)
2014-09-15 19:20:01 +04:00
}
2014-09-15 14:03:52 +04:00
}
}()
2014-09-19 15:21:13 +04:00
return q
2014-09-15 14:03:52 +04:00
}
2014-09-15 19:20:01 +04:00
2014-09-20 06:39:29 +04:00
// 关闭一个用户事件队列.
func (ueqs Queues) Close(sid string) {
q := ueqs[sid]
if nil == q {
return
}
delete(ueqs, sid)
}
2014-09-15 19:24:58 +04:00
// 事件处理接口.
2014-09-15 19:20:01 +04:00
type Handler interface {
Handle(event *Event)
}
2014-09-15 19:24:58 +04:00
// 函数指针包装.
2014-09-15 19:20:01 +04:00
type HandleFunc func(event *Event)
2014-09-15 19:24:58 +04:00
// 事件处理默认实现.
2014-09-15 19:20:01 +04:00
func (fn HandleFunc) Handle(event *Event) {
fn(event)
}