Как определить, когда очередь 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, и поэтому эта работа завершена, отправка команды уведомления".

Как уже упоминал Шон, было бы идеально отправить сообщение в другую очередь, например, "Электронная почта", по завершении обработки группы. Создайте приложение логики с включенным триггером, когда новое сообщение получено в очереди "Электронная почта", и действие для отправки электронного письма нужным получателям. Это довольно легко достичь даже без строки кода.

Другие вопросы по тегам