从SubscriptionClient获取邮件计数

时间:2017-09-05 22:00:31

标签: azureservicebus azure-servicebus-topics

出于日志记录的目的,我希望在给定订阅客户端的情况下获取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;
}

3 个答案:

答案 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;
}