• 6.1 创建消息管理模块
    • A) 创建消息管理模块抽象类
    • B) 实现消息管理模块

    6.1 创建消息管理模块

    A) 创建消息管理模块抽象类

    zinx/ziface下创建imsghandler.go文件。

    1. package ziface
    2. /*
    3. 消息管理抽象层
    4. */
    5. type IMsgHandle interface{
    6. DoMsgHandler(request IRequest) //马上以非阻塞方式处理消息
    7. AddRouter(msgId uint32, router IRouter) //为消息添加具体的处理逻辑
    8. }

    这里面有两个方法,AddRouter()就是添加一个msgId和一个路由关系到Apis中,那么DoMsgHandler()则是调用Router中具体Handle()等方法的接口。

    B) 实现消息管理模块

    zinx/znet下创建msghandler.go文件。

    1. package znet
    2. import (
    3. "fmt"
    4. "strconv"
    5. "zinx/ziface"
    6. )
    7. type MsgHandle struct{
    8. Apis map[uint32] ziface.IRouter //存放每个MsgId 所对应的处理方法的map属性
    9. }
    10. func NewMsgHandle() *MsgHandle {
    11. return &MsgHandle {
    12. Apis:make(map[uint32]ziface.IRouter),
    13. }
    14. }
    15. //马上以非阻塞方式处理消息
    16. func (mh *MsgHandle) DoMsgHandler(request ziface.IRequest) {
    17. handler, ok := mh.Apis[request.GetMsgID()]
    18. if !ok {
    19. fmt.Println("api msgId = ", request.GetMsgID(), " is not FOUND!")
    20. return
    21. }
    22. //执行对应处理方法
    23. handler.PreHandle(request)
    24. handler.Handle(request)
    25. handler.PostHandle(request)
    26. }
    27. //为消息添加具体的处理逻辑
    28. func (mh *MsgHandle) AddRouter(msgId uint32, router ziface.IRouter) {
    29. //1 判断当前msg绑定的API处理方法是否已经存在
    30. if _, ok := mh.Apis[msgId]; ok {
    31. panic("repeated api , msgId = " + strconv.Itoa(int(msgId)))
    32. }
    33. //2 添加msg与api的绑定关系
    34. mh.Apis[msgId] = router
    35. fmt.Println("Add api msgId = ", msgId)
    36. }