从 SubscriptionClient 获取消息计数

Get message count from SubscriptionClient

出于日志记录目的,我想在给定订阅客户端的情况下获取 Azure 服务总线订阅的消息计数。我发现唯一的 examples 使用 NamespaceManager,但这对我来说似乎有点多余,因为我已经有了 SubscriptionClient。有没有办法直接从客户端转到 SubscriptionDescription?

Fwiw,我尝试通过名称 space 经理使用绕行,但我得到一个它抛出 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;
}

Is there a way to go directly from the client to the SubscriptionDescription?

根据 SubscriptionClient Class,它不提供从给定 SubscriptionClient 对象获取消息计数的直接方法。

it throws a 401 Unauthorized error

代码 client.MessagingFactory.NamespaceEndpoints.First() returns 命名空间端点,您使用该服务初始化 Microsoft.ServiceBus.NamespaceManager class 的新实例命名空间 URI 基地址,但您没有指定授权您执行操作的凭据,因此当您执行 GetSubscription 操作时,它会出现 returns 401 错误。下面的代码在我这边没问题,你可以试试

NamespaceManager nsm = new NamespaceManager(client.MessagingFactory.NamespaceEndpoints.First(), TokenProvider.CreateSharedAccessSignatureTokenProvider("{keyName}", "{SharedAccessKey}"));

var subscriptionDesc = nsm.GetSubscription(topicName, subscriptionName);

long messageCount = subscriptionDesc.MessageCount;

您正在使用不正确的数据构建 NamespaceManager

client.MessagingFactory.NamespaceEndpoints.First()

returns Azure 服务总线命名空间 URI,不是所需的连接字符串。

Is there a way to go directly from the client to the SubscriptionDescription?

不是真的。要获取实体上的消息计数是一项必须经过 NamespaceManager 的管理操作。客户端是 运行 次对消息的操作,而不是对实体的管理。此外,您不应该每次都创建名称空间管理器。拥有它后,将其缓存并重新使用。

截至目前(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;
}