出于日志记录的目的,我希望在给定订阅客户端的情况下获取Azure Service Bus订阅的消息计数。我找到的唯一examples使用了NamespaceManager
,但这对我来说似乎有点多余,因为我已经有了SubscriptionClient
。有没有办法直接从客户端转到SubscriptionDescription
?
Fwiw,我尝试通过名称空间管理器使用绕道而行,但是我得到了一个401未经授权的错误:
int GetMessageCount(SubscriptionClient client) {
NameSpaceManager nsm = new NamespaceManager(client.MessagingFactory.NamespaceEndpoints.First());
SubscriptionDescription desc = nsm.GetSubscription(client.TopicPath, client.Name); // <-- throws error
long numMsg = desc.MessageCount;
return numMsg;
}
答案 0 :(得分:1)
有没有办法直接从客户端转到SubscriptionDescription?
根据SubscriptionClient Class,它没有提供从给定的SubscriptionClient对象获取消息计数的直接方法。
它会抛出401 Unauthorized错误
代码client.MessagingFactory.NamespaceEndpoints.First()
返回命名空间端点,您使用该服务命名空间URI基址初始化 Microsoft.ServiceBus.NamespaceManager 类的新实例,但是您没有指定一个凭据授权您执行操作,因此在执行 GetSubscription 操作时会返回401错误。以下代码在我这边工作正常,你可以试试。
NamespaceManager nsm = new NamespaceManager(client.MessagingFactory.NamespaceEndpoints.First(), TokenProvider.CreateSharedAccessSignatureTokenProvider("{keyName}", "{SharedAccessKey}"));
var subscriptionDesc = nsm.GetSubscription(topicName, subscriptionName);
long messageCount = subscriptionDesc.MessageCount;
答案 1 :(得分:1)
您正在使用不正确的数据构建NamespaceManager
。
client.MessagingFactory.NamespaceEndpoints.First()
返回Azure Service Bus命名空间 URI ,而不是所需的连接字符串。
有没有办法直接从客户端转到SubscriptionDescription?
不是真的。要在实体上获取消息计数,管理操作必须通过NamespaceManager
。客户端是对消息的运行时操作,而不是对实体的管理。此外,您不应每次都创建名称空间管理器。一旦你拥有它,缓存它并重新使用。
答案 2 :(得分:0)
截至目前(2019年11月),仍然无法通过SubscriptionClient
进行此操作。
还没有人提供有关此主题的解决方法,因此这是另一种通过ManagementClient
的方法:
public async static Task<long> GetSubscriptionMessageCountAsync(
ManagementClient client,
SubscriptionDescription subscription)
{
var runtimeInfo = await client.GetSubscriptionRuntimeInfoAsync(
subscription.TopicPath,
subscription.SubscriptionName);
return runtimeInfo.MessageCount;
}