如何从特定类型的Windows Service Bus订阅中获取未处理的消息计数?

时间:2013-07-25 11:58:22

标签: azure messages servicebus

我有1个主题,1个订阅。

我正在创建这样的消息:

BrokeredMessage messageTaskA = new BrokeredMessage("New Task");
messageTaskA.Properties["Type"] = "A";

BrokeredMessage messageTaskB = new BrokeredMessage("New Task");
messageTaskB.Properties["Type"] = "B";

我想要总消息,类型A的总消息,B类计数器的总消息:

1)订阅中的消息总数: SubscriptionDescription desc = namespaceManager.GetSubscription(“topicName”,“subscriptionName”); totalTask​​ = desc.MessageCount;

2)A类订阅中的消息总数: ????

3)B类订阅中的消息总数: ????

可以在不使用Receive和Abandon功能的情况下执行此操作吗?也许使用过滤器?

提前致谢 锐

4 个答案:

答案 0 :(得分:0)

这并不简单,因为包含其属性的消息在服务总线中处于序列化模式。 除非您将消息出列,否则无法查看消息的属性。

我可以想到一种方法,你可以使用peeklock,检查属性,进行计数并放弃它。 如果只有一个客户端,这将是很好的,因为其他客户端在锁定期间无法看到该消息。

您也可以创建不同的订阅,而不是将类型放在属性中。

答案 1 :(得分:0)

为什么不使用2个订阅将相应的消息类型放入适当的订阅中?

答案 2 :(得分:0)

试试这个

 var subscriptionDes = namespaceManager.GetSubscription("TestTopic", "SubscriptionName");
            long messageCount = subscriptionDesc.MessageCount;

答案 3 :(得分:0)

您可以添加一个过滤器,以便类型A的消息在subscriptionA中结束,而类型B的消息最终在subscriptionB中。

类似的东西:

myNamespaceManager.CreateSubscription(subDescriptionTypeB, new SqlFilter("Type = 'B'"));

然后你可以单独列出每个队列的消息。

如果您需要确保消息的处理顺序,则会出现问题。

您还可以使用peek method从订阅中获取邮件而不锁定它。但是效率不高,因为你需要获取所有消息,所以如果队列中有很多消息,我会说这是一个坏主意。