У меня есть функция веб-задания Azure, запускаемая из очереди:
public void ProcessQueueMessage([QueueTrigger("%MyQueue%")] Item item, TextWriter logger)
{
// Do normal processing...
}
Я хочу выборочно игнорировать определенные элементы очереди в зависимости от условия. Например, если у меня закончился виджет X, и я не хочу продолжать обрабатывать поставки виджетов, пока у меня не будет запаса. Поэтому я хочу временно игнорировать / пропускать все элементы очереди Widget X. Так что-то вроде:
public void ProcessQueueMessage([QueueTrigger("%MyQueue%")] Item item, TextWriter logger)
{
if (!HaveStock(WidgetX))
// Ignore queue item - treat it as if it was not in the queue at all
// Do normal processing...
}
Создание исключения для сбоя обработки не кажется мне вариантом, потому что это отравит сообщение.
Я мог бы установить для VisibilityTimeout какое-то произвольно высокое значение, а затем выдать исключение, но тогда, когда я хотел бы выполнить обработку (а не просто ждать тайм-аута), мне пришлось бы иметь отдельное сканирование процесса для элементов очереди с более высоким VisibilityTimeout и установите для тайм-аута меньшее значение (даже не уверен, возможно ли это). Но создание процесса для сканирования этих элементов очереди - это то, чего я пытаюсь избежать в первую очередь, поскольку я хотел бы сохранить логику в функции, запускаемой очередью, если это возможно.
Какие у меня есть варианты?
Обновление: я понимаю, что то, что я пытаюсь выполнить, несовместимо с целью функций, запускаемых очередью, в первую очередь, учитывая, что причина событий, запускаемых очередью, заключается в том, чтобы что-то делать при появлении сообщения, и что, если я хочу выборочно обработка Я мог бы сам реализовать процесс опроса очереди и обработки сообщений. Но я пытаюсь воспользоваться преимуществами более высокого уровня абстракции, обеспечиваемого триггерной обработкой.