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.

server.go 1.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package hub
  2. import (
  3. "gitlink.org.cn/cloudream/common/pkgs/mq"
  4. "gitlink.org.cn/cloudream/common/utils/sync2"
  5. mymq "gitlink.org.cn/cloudream/storage2/common/pkgs/mq"
  6. cortypes "gitlink.org.cn/cloudream/storage2/coordinator/types"
  7. )
  8. type Service interface {
  9. // UserSpaceService
  10. // CacheService
  11. HubService
  12. }
  13. type Server struct {
  14. service Service
  15. rabbitSvr mq.RabbitMQServer
  16. }
  17. func NewServer(svc Service, id cortypes.HubID, cfg mq.Config) (*Server, error) {
  18. srv := &Server{
  19. service: svc,
  20. }
  21. rabbitSvr, err := mq.NewRabbitMQServer(
  22. cfg,
  23. mymq.MakeHubQueueName(int64(id)),
  24. func(msg *mq.Message) (*mq.Message, error) {
  25. return msgDispatcher.Handle(srv.service, msg)
  26. },
  27. )
  28. if err != nil {
  29. return nil, err
  30. }
  31. srv.rabbitSvr = *rabbitSvr
  32. return srv, nil
  33. }
  34. func (s *Server) Stop() {
  35. s.rabbitSvr.Close()
  36. }
  37. func (s *Server) Start() *sync2.UnboundChannel[mq.RabbitMQServerEvent] {
  38. return s.rabbitSvr.Start()
  39. }
  40. func (s *Server) OnError(callback func(error)) {
  41. s.rabbitSvr.OnError = callback
  42. }
  43. var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher()
  44. // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型
  45. // TODO 需要约束:Service实现了TSvc接口
  46. func Register[TReq mq.MessageBody, TResp mq.MessageBody](svcFn func(svc Service, msg TReq) (TResp, *mq.CodeMessage)) any {
  47. mq.AddServiceFn(&msgDispatcher, svcFn)
  48. mq.RegisterMessage[TReq]()
  49. mq.RegisterMessage[TResp]()
  50. return nil
  51. }
  52. // RegisterNoReply 将Service中的一个*没有返回值的*接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型
  53. // TODO 需要约束:Service实现了TSvc接口
  54. func RegisterNoReply[TReq mq.MessageBody](svcFn func(svc Service, msg TReq)) any {
  55. mq.AddNoRespServiceFn(&msgDispatcher, svcFn)
  56. mq.RegisterMessage[TReq]()
  57. return nil
  58. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。