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.
57 lines
1.7 KiB
57 lines
1.7 KiB
package agent
|
|
|
|
import (
|
|
"context"
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/client/sub_client"
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/topic"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/mq_agent_pb"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials/insecure"
|
|
"math/rand/v2"
|
|
"time"
|
|
)
|
|
|
|
func (a *MessageQueueAgent) StartSubscribeSession(ctx context.Context, req *mq_agent_pb.StartSubscribeSessionRequest) (*mq_agent_pb.StartSubscribeSessionResponse, error) {
|
|
sessionId := rand.Int64()
|
|
|
|
subscriberConfig := &sub_client.SubscriberConfiguration{
|
|
ConsumerGroup: req.ConsumerGroup,
|
|
ConsumerGroupInstanceId: req.ConsumerGroupInstanceId,
|
|
GrpcDialOption: grpc.WithTransportCredentials(insecure.NewCredentials()),
|
|
MaxPartitionCount: req.MaxSubscribedPartitions,
|
|
SlidingWindowSize: req.SlidingWindowSize,
|
|
}
|
|
|
|
contentConfig := &sub_client.ContentConfiguration{
|
|
Topic: topic.FromPbTopic(req.Topic),
|
|
Filter: req.Filter,
|
|
PartitionOffsets: req.PartitionOffsets,
|
|
}
|
|
|
|
topicSubscriber := sub_client.NewTopicSubscriber(
|
|
a.brokersList(),
|
|
subscriberConfig,
|
|
contentConfig,
|
|
make(chan sub_client.KeyedOffset, 1024),
|
|
)
|
|
|
|
a.subscribersLock.Lock()
|
|
// remove inactive publishers to avoid memory leak
|
|
for k, entry := range a.subscribers {
|
|
if entry.lastActiveTsNs == 0 {
|
|
// this is an active session
|
|
continue
|
|
}
|
|
if time.Unix(0, entry.lastActiveTsNs).Add(10 * time.Hour).Before(time.Now()) {
|
|
delete(a.subscribers, k)
|
|
}
|
|
}
|
|
a.subscribers[SessionId(sessionId)] = &SessionEntry[*sub_client.TopicSubscriber]{
|
|
entry: topicSubscriber,
|
|
}
|
|
a.subscribersLock.Unlock()
|
|
|
|
return &mq_agent_pb.StartSubscribeSessionResponse{
|
|
SessionId: sessionId,
|
|
}, nil
|
|
}
|