package mq import ( "fmt" myreflect "gitlink.org.cn/cloudream/common/utils/reflect" ) type HandlerFn func(svcBase any, msg *Message) (*Message, error) type MessageDispatcher struct { Handlers map[myreflect.Type]HandlerFn } func NewMessageDispatcher() MessageDispatcher { return MessageDispatcher{ Handlers: make(map[myreflect.Type]HandlerFn), } } func (h *MessageDispatcher) Add(typ myreflect.Type, handler HandlerFn) { h.Handlers[typ] = handler } func (h *MessageDispatcher) Handle(svcBase any, msg *Message) (*Message, error) { typ := myreflect.TypeOfValue(msg.Body) fn, ok := h.Handlers[typ] if !ok { return nil, fmt.Errorf("unsupported message type: %s", typ.Name()) } return fn(svcBase, msg) } // 将Service中的一个接口函数作为指定类型消息的处理函数 func AddServiceFn[TSvc any, TReq any, TResp any](dispatcher *MessageDispatcher, svcFn func(svc TSvc, msg *TReq) (*TResp, *CodeMessage)) { dispatcher.Add(myreflect.TypeOf[TReq](), func(svcBase any, reqMsg *Message) (*Message, error) { reqMsgBody := reqMsg.Body.(TReq) ret, codeMsg := svcFn(svcBase.(TSvc), &reqMsgBody) var body MessageBodyTypes if ret != nil { body = *ret } respMsg := MakeMessage(body) respMsg.SetCodeMessage(codeMsg.Code, codeMsg.Message) return &respMsg, nil }) } // 将Service中的一个*没有返回值的*接口函数作为指定类型消息的处理函数 func AddNoRespServiceFn[TSvc any, TReq any](dispatcher *MessageDispatcher, svcFn func(svc TSvc, msg *TReq)) { dispatcher.Add(myreflect.TypeOf[TReq](), func(svcBase any, reqMsg *Message) (*Message, error) { reqMsgBody := reqMsg.Body.(TReq) svcFn(svcBase.(TSvc), &reqMsgBody) return nil, nil }) }