You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

message_dispatcher.go 1.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package mq
  2. import (
  3. "fmt"
  4. myreflect "gitlink.org.cn/cloudream/common/utils/reflect"
  5. )
  6. type HandlerFn func(svcBase any, msg *Message) (*Message, error)
  7. type MessageDispatcher struct {
  8. Handlers map[myreflect.Type]HandlerFn
  9. }
  10. func NewMessageDispatcher() MessageDispatcher {
  11. return MessageDispatcher{
  12. Handlers: make(map[myreflect.Type]HandlerFn),
  13. }
  14. }
  15. func (h *MessageDispatcher) Add(typ myreflect.Type, handler HandlerFn) {
  16. h.Handlers[typ] = handler
  17. }
  18. func (h *MessageDispatcher) Handle(svcBase any, msg *Message) (*Message, error) {
  19. typ := myreflect.TypeOfValue(msg.Body)
  20. fn, ok := h.Handlers[typ]
  21. if !ok {
  22. return nil, fmt.Errorf("unsupported message type: %s", typ.Name())
  23. }
  24. return fn(svcBase, msg)
  25. }
  26. // 将Service中的一个接口函数作为指定类型消息的处理函数
  27. func AddServiceFn[TSvc any, TReq any, TResp any](dispatcher *MessageDispatcher, svcFn func(svc TSvc, msg *TReq) (*TResp, *CodeMessage)) {
  28. dispatcher.Add(myreflect.TypeOf[TReq](), func(svcBase any, reqMsg *Message) (*Message, error) {
  29. reqMsgBody := reqMsg.Body.(TReq)
  30. ret, codeMsg := svcFn(svcBase.(TSvc), &reqMsgBody)
  31. var body MessageBodyTypes
  32. if ret != nil {
  33. body = *ret
  34. }
  35. respMsg := MakeMessage(body)
  36. respMsg.SetCodeMessage(codeMsg.Code, codeMsg.Message)
  37. return &respMsg, nil
  38. })
  39. }
  40. // 将Service中的一个*没有返回值的*接口函数作为指定类型消息的处理函数
  41. func AddNoRespServiceFn[TSvc any, TReq any](dispatcher *MessageDispatcher, svcFn func(svc TSvc, msg *TReq)) {
  42. dispatcher.Add(myreflect.TypeOf[TReq](), func(svcBase any, reqMsg *Message) (*Message, error) {
  43. reqMsgBody := reqMsg.Body.(TReq)
  44. svcFn(svcBase.(TSvc), &reqMsgBody)
  45. return nil, nil
  46. })
  47. }

公共库