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