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.
		
		
		
		
		
			
		
			
				
					
					
						
							87 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							87 lines
						
					
					
						
							2.5 KiB
						
					
					
				
								package agent_client
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"context"
							 | 
						|
									"fmt"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/mq/topic"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/pb/mq_agent_pb"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
							 | 
						|
									"google.golang.org/grpc"
							 | 
						|
									"google.golang.org/grpc/credentials/insecure"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								type SubscribeOption struct {
							 | 
						|
									ConsumerGroup           string
							 | 
						|
									ConsumerGroupInstanceId string
							 | 
						|
									Topic                   topic.Topic
							 | 
						|
									OffsetType              schema_pb.OffsetType
							 | 
						|
									OffsetTsNs              int64
							 | 
						|
									Filter                  string
							 | 
						|
									MaxSubscribedPartitions int32
							 | 
						|
									SlidingWindowSize       int32
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								type SubscribeSession struct {
							 | 
						|
									Option *SubscribeOption
							 | 
						|
									stream grpc.BidiStreamingClient[mq_agent_pb.SubscribeRecordRequest, mq_agent_pb.SubscribeRecordResponse]
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func NewSubscribeSession(agentAddress string, option *SubscribeOption) (*SubscribeSession, error) {
							 | 
						|
									// call local agent grpc server to create a new session
							 | 
						|
									clientConn, err := grpc.NewClient(agentAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
							 | 
						|
									if err != nil {
							 | 
						|
										return nil, fmt.Errorf("dial agent server %s: %v", agentAddress, err)
							 | 
						|
									}
							 | 
						|
									agentClient := mq_agent_pb.NewSeaweedMessagingAgentClient(clientConn)
							 | 
						|
								
							 | 
						|
									initRequest := &mq_agent_pb.SubscribeRecordRequest_InitSubscribeRecordRequest{
							 | 
						|
										ConsumerGroup:           option.ConsumerGroup,
							 | 
						|
										ConsumerGroupInstanceId: option.ConsumerGroupInstanceId,
							 | 
						|
										Topic: &schema_pb.Topic{
							 | 
						|
											Namespace: option.Topic.Namespace,
							 | 
						|
											Name:      option.Topic.Name,
							 | 
						|
										},
							 | 
						|
										OffsetType:              option.OffsetType,
							 | 
						|
										OffsetTsNs:              option.OffsetTsNs,
							 | 
						|
										MaxSubscribedPartitions: option.MaxSubscribedPartitions,
							 | 
						|
										Filter:                  option.Filter,
							 | 
						|
										SlidingWindowSize:       option.SlidingWindowSize,
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									stream, err := agentClient.SubscribeRecord(context.Background())
							 | 
						|
									if err != nil {
							 | 
						|
										return nil, fmt.Errorf("subscribe record: %w", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if err = stream.Send(&mq_agent_pb.SubscribeRecordRequest{
							 | 
						|
										Init: initRequest,
							 | 
						|
									}); err != nil {
							 | 
						|
										return nil, fmt.Errorf("send session id: %w", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									return &SubscribeSession{
							 | 
						|
										Option: option,
							 | 
						|
										stream: stream,
							 | 
						|
									}, nil
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (s *SubscribeSession) CloseSession() error {
							 | 
						|
									err := s.stream.CloseSend()
							 | 
						|
									return err
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (a *SubscribeSession) SubscribeMessageRecord(
							 | 
						|
									onEachMessageFn func(key []byte, record *schema_pb.RecordValue),
							 | 
						|
									onCompletionFn func()) error {
							 | 
						|
									for {
							 | 
						|
										resp, err := a.stream.Recv()
							 | 
						|
										if err != nil {
							 | 
						|
											return err
							 | 
						|
										}
							 | 
						|
										onEachMessageFn(resp.Key, resp.Value)
							 | 
						|
									}
							 | 
						|
									if onCompletionFn != nil {
							 | 
						|
										onCompletionFn()
							 | 
						|
									}
							 | 
						|
									return nil
							 | 
						|
								}
							 |