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

55 lines
1.5 KiB

  1. package agent
  2. import (
  3. "github.com/seaweedfs/seaweedfs/weed/mq/client/pub_client"
  4. "github.com/seaweedfs/seaweedfs/weed/mq/client/sub_client"
  5. "github.com/seaweedfs/seaweedfs/weed/pb"
  6. "github.com/seaweedfs/seaweedfs/weed/pb/mq_agent_pb"
  7. "google.golang.org/grpc"
  8. "sync"
  9. )
  10. type SessionId int64
  11. type SessionEntry[T any] struct {
  12. entry T
  13. }
  14. type MessageQueueAgentOptions struct {
  15. SeedBrokers []pb.ServerAddress
  16. }
  17. type MessageQueueAgent struct {
  18. mq_agent_pb.UnimplementedSeaweedMessagingAgentServer
  19. option *MessageQueueAgentOptions
  20. brokers []pb.ServerAddress
  21. grpcDialOption grpc.DialOption
  22. publishers map[SessionId]*SessionEntry[*pub_client.TopicPublisher]
  23. publishersLock sync.RWMutex
  24. subscribers map[SessionId]*SessionEntry[*sub_client.TopicSubscriber]
  25. subscribersLock sync.RWMutex
  26. }
  27. func NewMessageQueueAgent(option *MessageQueueAgentOptions, grpcDialOption grpc.DialOption) *MessageQueueAgent {
  28. // initialize brokers which may change later
  29. var brokers []pb.ServerAddress
  30. for _, broker := range option.SeedBrokers {
  31. brokers = append(brokers, broker)
  32. }
  33. return &MessageQueueAgent{
  34. option: option,
  35. brokers: brokers,
  36. grpcDialOption: grpcDialOption,
  37. publishers: make(map[SessionId]*SessionEntry[*pub_client.TopicPublisher]),
  38. subscribers: make(map[SessionId]*SessionEntry[*sub_client.TopicSubscriber]),
  39. }
  40. }
  41. func (a *MessageQueueAgent) brokersList() []string {
  42. var brokers []string
  43. for _, broker := range a.brokers {
  44. brokers = append(brokers, broker.String())
  45. }
  46. return brokers
  47. }