@@ -338,29 +338,53 @@ void ClientImpl::subscribeWithRegexAsync(const std::string& regexPattern, const
338338 }
339339 }
340340
341- NamespaceNamePtr nsName = topicNamePtr->getNamespaceName ();
341+ if (TopicName::containsDomain (regexPattern)) {
342+ LOG_WARN (" Ignore invalid domain: "
343+ << topicNamePtr->getDomain ()
344+ << " , use the RegexSubscriptionMode parameter to set the topic type" );
345+ }
346+
347+ CommandGetTopicsOfNamespace_Mode mode;
348+ auto regexSubscriptionMode = conf.getRegexSubscriptionMode ();
349+ switch (regexSubscriptionMode) {
350+ case PersistentOnly:
351+ mode = CommandGetTopicsOfNamespace_Mode_PERSISTENT;
352+ break ;
353+ case NonPersistentOnly:
354+ mode = CommandGetTopicsOfNamespace_Mode_NON_PERSISTENT;
355+ break ;
356+ case AllTopics:
357+ mode = CommandGetTopicsOfNamespace_Mode_ALL;
358+ break ;
359+ default :
360+ LOG_ERROR (" RegexSubscriptionMode not valid: " << regexSubscriptionMode);
361+ callback (ResultInvalidConfiguration, Consumer ());
362+ return ;
363+ }
342364
343- lookupServicePtr_->getTopicsOfNamespaceAsync (nsName).addListener (
344- std::bind (&ClientImpl::createPatternMultiTopicsConsumer, shared_from_this (), std::placeholders::_1,
345- std::placeholders::_2, regexPattern, subscriptionName, conf, callback));
365+ lookupServicePtr_->getTopicsOfNamespaceAsync (topicNamePtr->getNamespaceName (), mode)
366+ .addListener (std::bind (&ClientImpl::createPatternMultiTopicsConsumer, shared_from_this (),
367+ std::placeholders::_1, std::placeholders::_2, regexPattern, mode,
368+ subscriptionName, conf, callback));
346369}
347370
348371void ClientImpl::createPatternMultiTopicsConsumer (const Result result, const NamespaceTopicsPtr topics,
349372 const std::string& regexPattern,
373+ CommandGetTopicsOfNamespace_Mode mode,
350374 const std::string& subscriptionName,
351375 const ConsumerConfiguration& conf,
352376 SubscribeCallback callback) {
353377 if (result == ResultOk) {
354378 ConsumerImplBasePtr consumer;
355379
356- PULSAR_REGEX_NAMESPACE::regex pattern (regexPattern);
380+ PULSAR_REGEX_NAMESPACE::regex pattern (TopicName::removeDomain ( regexPattern) );
357381
358382 NamespaceTopicsPtr matchTopics =
359383 PatternMultiTopicsConsumerImpl::topicsPatternFilter (*topics, pattern);
360384
361385 auto interceptors = std::make_shared<ConsumerInterceptors>(conf.getInterceptors ());
362386
363- consumer = std::make_shared<PatternMultiTopicsConsumerImpl>(shared_from_this (), regexPattern,
387+ consumer = std::make_shared<PatternMultiTopicsConsumerImpl>(shared_from_this (), regexPattern, mode,
364388 *matchTopics, subscriptionName, conf,
365389 lookupServicePtr_, interceptors);
366390
0 commit comments