由Producer或Consumer端调用MQClientInstance. updateTopicRouteInfoFromNameServer()方法的目的主要有:
1)从NameServer获取该客户端订阅的每个topic的相关信息(包括每个topic对应的Broker信息和topic配置信息),用TopicRouteData对象表示;并将该对象信息存入MQClientInstance.topicRouteTable变量中;
2)根据返回的信息更新topic对应的BrokerName和BrokerId,保存在变量 MQClientInstance.brokerAddrTable中;
3)对于Prodcuer,根据每个topic以及配置的写队列个数创建MessageQueue消费队列,并存入变量DefaultMQProducerImpl.topicPublishInfoTable中;
4)对于已经订阅了该topic的Consumer,根据每个topic以及配置的读队列个数创建MessageQueue消费队列,并存入变量RebalanceImpl. topicSubscribeInfoTable中;
大致逻辑如下:
1、获取Producer或Consumer端的所有topic列表,步骤如下:
1.1)对于PushConsumer端:遍历MQClientInstance.consumerTable:
ConcurrentHashMap<String/* group */, MQConsumerInner>变量,对于每个DefaultMQPushConsumerImpl(MQConsumerInner的子类),获取DefaultMQPushConsumerImpl.rebalanceImpl:RebalanceImpl变量中的RebalanceImpl.subscriptionInner:ConcurrentHashMap<String, SubscriptionData>变量的values值,即SubscriptionData的集合;然后遍历SubscriptionData集合,取出每个SubscriptionData对象的topic变量值,即构成了该PushConsumer端的所有topic列表;
1.2)对于PullConsumer端:遍历MQClientInstance.consumerTable:
ConcurrentHashMap<String/* group */, MQConsumerInner>变量,对于每个DefaultMQPullConsumerImpl(MQConsumerInner的子类),对应的DefaultMQPullConsumer.registerTopics的变量值集合构成了该PullConsumer端的所有to