Очередь служебной шины Azure Блокировка PeekBatch?

129
17

Я использую метод PeekBatch(<messageCount>) в QueueClient (пакет служебной шины Windows Azure 2.1.2.0).


Он отлично работает в первый раз и возвращает мое единственное сообщение, которое существует в моей очереди, но последующие вызовы не возвращают ничего. Через пять минут вызов снова вернет сообщение.


Пять минут - это максимальное время блокировки на BrokeredMessage, поэтому мне интересно, действительно ли PeekBatch блокирует такие сообщения, как это происходит при приеме, даже если подглядывание не должно блокироваться, насколько я знаю.


Я пытаюсь создать MVC-представление, чтобы видеть, что на самом деле сидит в моей очереди, но этот мешает. Может ли кто-нибудь дать какие-либо рекомендации по этому поводу?


Обновить. Это происходит только тогда, когда я кэширую свой QueueClient с помощью статического свойства. Если я создаю QueueClient каждый раз, PeekBatch работает так, как ожидалось. Я до сих пор не знаю, почему это повторяет использование QueueClient. Microsoft, похоже, рекомендует повторно использовать QueueClient хотя, вместо того, чтобы воссоздавать его каждый раз, поэтому я все еще здесь не понимаю.

спросил(а) 2021-01-28T00:35:41+03:00 1 месяц назад
1
Решение
160

QueueClient в некоторой степени полезен. В методах Peek (Peek и PeekBatch) вы можете просто вызвать их или указать определенный порядковый номер для получения определенного сообщения после определенного порядкового номера. Если вы просто вызываете Peek или в вашем случае PeekBatch, без порядкового номера, он будет извлекать самое первое сообщение или сообщения в очереди. Когда сообщение возвращается, QueueClient отслеживает последний порядковый номер, который он вытащил. Каждый последующий вызов Peek будет получать следующее сообщение в очереди. Идея состоит в том, что вы "просматриваете" сообщения и не просто интересуетесь первым сообщением в очереди каждый раз.


Итак, если вы были в цикле и многократно нажимали peek, пока он не вернул сообщение, вы, по сути, просмотрели все сообщения в очереди.


Поскольку вы вызываете PeekBatch без порядкового номера, QueueClient запоминает последний набор, который он получил, тогда следующий вызов фактически попытается получить следующий набор после последнего просматриваемого сообщения. Вот почему, когда вы воссоздаете QueueClient, это выглядит как reset. Причина, по которой он казался reset на своем собственном уровне через 5 минут, кажется странным, но, возможно, просто очистка значений браузера после некоторого момента, связанного с операцией таймаута в очереди. К тому времени порядковый номер был бы довольно далеко, если бы он был занятой очередью.

Если вам нужно действительно посмотреть только на первое сообщение, тогда вызовите peek только один раз. Он вернет только первое сообщение. Если вам нужно постоянно вытаскивать первое сообщение каждый раз за Peek (0). Если вы хотите, чтобы первые сказали 10 сообщений каждый раз, тогда вызывается PeekBatch (0, 10); это будет похоже на то, что я даю первые десять сообщений с порядковым номером, большим 0.


Рекомендации по повторному использованию QueueClient звучат. Он делает все виды кеширования информации и вещей. Вы не хотите, чтобы каждый раз его воссоздавать.

ответил(а) 2021-01-28T00:35:41+03:00 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема