У меня есть X рабочих ролей, затем я проверяю очереди и обрабатываю данные.< /p>
Я не ожидаю, что в очереди будет много сообщений, поскольку цель состоит в том, чтобы обработать сообщение, завершить его, а затем снова добавить то же сообщение, но запланированное на Х минут времени. Это даст мне возможность продолжить обработку этих задач.
Самое замечательное в функциональности Azure заключается в том, что они выполняют за вас всю работу на стороне сервера, но недостатком является то, что иногда бывает сложно отлаживать данные или манипулировать ими.
Что я хочу, так это представить список сообщений в очереди (что я сделали с помощью PeekBatch) в веб-интерфейсе. Затем я хочу иметь возможность выбрать некоторые/все сообщения и удалить их.
Я могу сделать это, если в коде есть ошибка, и я хочу чтобы остановить сообщения определенного типа.
В дальнейшем у меня появится возможность повторно добавлять сообщения с веб-страницы. Возможно, я захочу увеличить количество рабочих ролей и сообщений, чтобы выполнить задачу быстрее (или замедлить ее), или повторно добавить удаленные сообщения.
Итак, вопрос в том, как я могу выбрать конкретное сообщение из очереди, а затем удалить его? Насколько я вижу, очевидного способа сделать это не существует, и, если это возможно, потребуется какой-то обходной путь. Для меня это звучит немного странно.
Редактировать:
У меня есть кое-что, что работает, но это на самом деле это не лучшее решение:
Код: Выделить всё
public void DeleteMessages(List messageIds)
{
foreach (var msg in Client.ReceiveBatch(100))
{
if (messageIds.Contains(msg.SequenceNumber))
msg.Complete(); // Deletes the message
else
msg.Abandon(); // Puts it back in the queue
}
}
p>
Он также будет удалять только те сообщения, которые готовы к обработке. Сообщения в будущем будут игнорироваться, поэтому сейчас я добавил возможность добавлять сообщения «Сон», чтобы остановить обработку очереди до тех пор, пока мои сообщения не будут «готовы», и я смогу их удалить.
В Microsoft сообщили мне, что в настоящее время они работают над API для удаления определенных сообщений, которые должны быть доступны через несколько месяцев. А пока все дело в обходных путях.
Июньское обновление:
По-прежнему никаких обновлений от Microsoft по этому вопросу не было, и описанный выше метод был далеко не идеальным. Теперь я изменил свой код так, что:
Объект, который я помещаю в сообщение, имеет новое свойство:
Код: Выделить всё
Guid? MessageId { get; set; }
Когда я хочу удалить сообщение, я добавляю свой MessageId в таблицу базы данных «DeletedMessage».
Когда дело доходит до обработки сообщения, я просматриваю таблицу DeletedMessage на предмет соответствия Руководство, и если оно его найдет, я просто Complete() сообщение без выполнения обычной обработки.
Это работает хорошо, но требует небольших накладных расходов. Если вы не имеете дело с огромным количеством сообщений, это не большая проблема.
Также обратите внимание, что изначально я сделал это, используя SequenceNumber, но (как ни странно) SequenceNumber изменяется. между просмотром и получением сообщения! Это не позволит этой идее работать, если вы не используете свой собственный идентификатор, как указано выше.
Подробнее здесь: https://stackoverflow.com/questions/270 ... ic-message