Когда в веб-задании Azure удаляется элемент в очереди Azure? - PullRequest
0 голосов
/ 02 июня 2018

Я создал запущенное веб-задание, используя очередь Azure.Для краткости моя функция выглядит так:

    public static void ProcessQueueMessage([QueueTrigger("myqueue")] string message, TextWriter log)
    {
        log.WriteLine(message);
        System.Threading.Thread.Sleep(10000);
    }

У меня есть другая функция, которая добавляет элементы в очередь для обработки.Однако я хочу проверить последние xx сообщения, чтобы определить, существует ли уже элемент в очереди (с тем же сообщением).Примерно так:

while (true)
{
    var myMessageId = "98uasd98fusad8";
    CloudQueue queue = queueClient.GetQueueReference("myqueue");
    queue.CreateIfNotExists();
    var maxMessagesToCheck = 99;
    var oldMessages = queue.GetMessages(maxMessagesToCheck, null);
    if (!oldMessages.Any(x => x.AsString == myMessageId))
    {
        CloudQueueMessage message = new CloudQueueMessage(myMessageId);
        queue.AddMessage(message);
    }
}

Тем не менее, я просто не уверен, когда какой-то элемент «выталкивается» из очереди.Отпускается ли он после завершения обработки и возврата функции ProcessQueueMessage (без ошибки)?Или же оно выталкивается сразу после начала обработки ?

Если элементы отбрасываются после , обработка завершается, тогда моя вторая функция выше будет работать нормально,Однако, если предметы отскочат, как только начнется процесс, мне придется найти другое решение.

Это может быть более краткий способ задать вопрос:

    public static void ProcessQueueMessage([QueueTrigger("myqueue")] string message, TextWriter log)
    {
        //IS THE ITEM IN THE QUEUE POPPED OFF HERE?
        log.WriteLine(message);
        System.Threading.Thread.Sleep(10000);
    } //OR IS THE ITEM IN THE QUEUE POPPED OFF HERE?

1 Ответ

0 голосов
/ 07 июня 2018

Согласно Microsoft doc

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

По этой причине ваше решение не будет работать,скажем, у вас есть 10 сообщений в очереди, и первое сообщение в настоящее время обрабатывается вашей первой функцией, поэтому, когда функция проверки запускается, она может только просматривать сообщения после нее, например, она просматривает сообщение 2,3,4 в пакетеТак же, как и первой функции, ей необходимо установить блокировку для трех сообщений, поэтому, когда первая функция завершает сообщение 1, она может получить только сообщение 5, которое не было проверено.

...