如何检测ServiceBus队列何时为空?

时间:2016-03-08 12:39:00

标签: c# .net azure queue servicebus

我正在使用WebJob通过触发器方法从我的ServiceBus队列中取出它似乎运行良好。问题是我有一个夜间工作,将工作泵入队列,然后我想在最后处理队列工作以通过电子邮件发送结果时再运行另一个工作。我的WebJob目前一次处理16个项目,我可能必须运行多个WebJobs来处理负载,所以我不觉得我只能检查每个触发器上的队列是否为空。

ServiceBus有没有办法在空的时候发出信号?我是否应该再运行一个每10分钟检查一次的重复进程并以每日比特值激活以确保它已完成?似乎效率低下。我在这里缺少一些Azure模式吗?

3 个答案:

答案 0 :(得分:1)

Azure Service Bus不会发出有关空队列的信号。知道队列中是否有任何数量的消息可能被认为是反模式。作为Clemens Vasters said

  

任何时候任何#Azure #ServiceBus客户端代码都会查看QueueDescription.MessageCount以确定是否调用Receive - 这是一个错误。不

队列可以在任何时间点包含工作项。你永远不知道什么时候会结束。如果您的消息表示某个组作为一个组并且需要在该组处理结束时触发操作,那么您可以拥有一些可以跟踪已完成的工作以及何时完成的操作,触发另一条消息。它可能是“我为会话Y处理了X消息,因此完成了这项工作,发送了通知命令”。

答案 1 :(得分:1)

您可以使用NamespaceManaager的实例来执行此操作。它为您提供订阅中的邮件数。

NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(<connectionstring>);
            var subscription = nsManager.GetSubscription(
                <topicName>,<subscriptionName>);
if(subscription != null && subscription.MessageCount > 0)
//do something

如果要避免DLQ计数,则可以在上面的代码中使用subscription.MessageCountDetails.ActiveMessageCount代替。

答案 2 :(得分:0)

正如肖恩(Sean)所提到的,在组处理完成时,将消息提交到另一个队列,例如“电子邮件”是理想的选择。创建一个逻辑应用程序,并在“电子邮件”队列中收到“新消息”时触发,并采取行动将电子邮件发送给所需的收件人。甚至不用一行代码就可以很容易地做到这一点。