Как определить, когда очередь ServiceBus пуста?
Я использую WebJob для извлечения из моей очереди ServiceBus с помощью метода триггера, и это, кажется, работает хорошо. Проблема в том, что у меня есть ночная работа, которая перекачивает работу в очередь, а затем я хотел бы, чтобы в конце была запущена другая работа, когда работа очереди была наконец обработана для отправки результатов по электронной почте. Мой WebJob в настоящее время обрабатывает 16 элементов одновременно, и мне, вероятно, придется запустить несколько WebJobs для обработки нагрузки, поэтому я не чувствую, что могу просто проверить, пуста ли очередь для каждого триггера.
Есть ли способ, которым ServiceBus может сигнализировать, когда он пуст? Должен ли я просто запустить еще один повторяющийся процесс, который проверяет каждые 10 минут и запускает с ежедневным значением бита, чтобы убедиться, что это сделано? Кажется неэффективным. Есть ли здесь какой-то шаблон Azure, который мне не хватает?
3 ответа
Вы можете сделать это с помощью экземпляра NamespaceManaager. Это дает вам количество сообщений в подписке.
NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(<connectionstring>);
var subscription = nsManager.GetSubscription(
<topicName>,<subscriptionName>);
if(subscription != null && subscription.MessageCount > 0)
//do something
Если вы хотите избежать подсчета DLQ, вы можете использовать subscription.MessageCountDetails.ActiveMessageCount
вместо этого в приведенном выше коде.
Сервисная шина Azure не будет сигнализировать о пустых очередях. Знание, есть ли какое-либо количество сообщений в очереди, вероятно, будет считаться антишаблоном. Как сказал Клеменс Вастерс
В любое время любой клиентский код #Azure #ServiceBus просматривает QueueDescription.MessageCount, чтобы определить, следует ли вызывать метод Receive - это ошибка. не
Очередь может содержать рабочие элементы в любой момент времени. Вы никогда не знаете, когда это закончится. Если у вас есть сообщения, представляющие что-то как группу, и вам нужно инициировать операцию в конце обработки этой группы, у вас может быть что-то, что может отслеживать, какая работа была выполнена, и когда все это будет выполнено, инициировать другое сообщение. Это может быть "Я обработал X сообщений для сеанса Y, и поэтому эта работа завершена, отправка команды уведомления".
Как уже упоминал Шон, было бы идеально отправить сообщение в другую очередь, например, "Электронная почта", по завершении обработки группы. Создайте приложение логики с включенным триггером, когда новое сообщение получено в очереди "Электронная почта", и действие для отправки электронного письма нужным получателям. Это довольно легко достичь даже без строки кода.