예제 #1
0
        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;
            }
        }
예제 #2
0
 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);
 }