public IList<TopicRouteInfo> GetTopicRouteInfo(GetTopicRouteInfoRequest request) { lock (_lockObj) { var returnList = new List<TopicRouteInfo>(); Cluster cluster; if (string.IsNullOrEmpty(request.ClusterName) || !_clusterDict.TryGetValue(request.ClusterName, out cluster)) { return returnList; } foreach (var brokerGroup in cluster.BrokerGroups.Values) { foreach (var broker in brokerGroup.Brokers.Values) { if (request.OnlyFindMaster && broker.BrokerInfo.BrokerRole != (int)BrokerRole.Master) { continue; } var queueList = new List<int>(); var topicQueueInfoList = broker.TopicQueueInfoList.Where(x => x.Topic == request.Topic).ToList(); if (topicQueueInfoList.Count > 0) { if (request.ClientRole == ClientRole.Producer) { queueList = topicQueueInfoList.Where(x => x.ProducerVisible).Select(x => x.QueueId).ToList(); } else if (request.ClientRole == ClientRole.Consumer) { queueList = topicQueueInfoList.Where(x => x.ConsumerVisible).Select(x => x.QueueId).ToList(); } } else if (_nameServerController.Setting.AutoCreateTopic) { queueList = CreateTopicOnBroker(request.Topic, broker).ToList(); } returnList.Add(new TopicRouteInfo { BrokerInfo = broker.BrokerInfo, QueueInfo = queueList }); } } return returnList; } }
private IList<TopicRouteInfo> GetTopicRouteInfoList(string topic) { var nameServerRemotingClient = GetAvailableNameServerRemotingClient(); var request = new GetTopicRouteInfoRequest { ClientRole = _producer != null ? ClientRole.Producer : ClientRole.Consumer, ClusterName = _setting.ClusterName, OnlyFindMaster = _setting.OnlyFindMasterBroker, Topic = topic }; var data = _binarySerializer.Serialize(request); var remotingRequest = new RemotingRequest((int)NameServerRequestCode.GetTopicRouteInfo, data); var remotingResponse = nameServerRemotingClient.InvokeSync(remotingRequest, 5 * 1000); if (remotingResponse.Code != ResponseCode.Success) { throw new Exception(string.Format("Get topic route info from name server failed, topic: {0}, nameServerAddress: {1}, remoting response code: {2}, errorMessage: {3}", topic, nameServerRemotingClient.ServerEndPoint.ToAddress(), remotingResponse.Code, Encoding.UTF8.GetString(remotingResponse.Body))); } return _binarySerializer.Deserialize<IList<TopicRouteInfo>>(remotingResponse.Body); }