in rocketmq-client-csharp/Client.cs [220:267]
public async Task<TopicRouteData> GetRouteFor(string topic, bool direct)
{
if (!direct && _topicRouteTable.ContainsKey(topic))
{
return _topicRouteTable[topic];
}
// We got one or more name servers available.
var request = new rmq::QueryRouteRequest();
request.Topic = new rmq::Resource();
request.Topic.ResourceNamespace = _resourceNamespace;
request.Topic.Name = topic;
request.Endpoints = new rmq::Endpoints();
request.Endpoints.Scheme = AccessPointScheme;
foreach (var address in AccessPointEndpoints)
{
request.Endpoints.Addresses.Add(address);
}
var metadata = new grpc.Metadata();
Signature.sign(this, metadata);
int index = _random.Next(0, AccessPointEndpoints.Count);
var serviceEndpoint = AccessPointEndpoints[index];
// AccessPointAddresses.Count
string target = $"https://{serviceEndpoint.Host}:{serviceEndpoint.Port}";
TopicRouteData topicRouteData;
try
{
Logger.Debug($"Resolving route for topic={topic}");
topicRouteData = await Manager.ResolveRoute(target, metadata, request, RequestTimeout);
if (null != topicRouteData)
{
Logger.Debug($"Got route entries for {topic} from name server");
_topicRouteTable.TryAdd(topic, topicRouteData);
return topicRouteData;
}
else
{
Logger.Warn($"Failed to query route of {topic} from {target}");
}
}
catch (Exception e)
{
Logger.Warn(e, "Failed when querying route");
}
return null;
}