Хранилище очередей Azure не отправляет сообщение очереди

StackOverflow https://stackoverflow.com//questions/21025970

Вопрос

Я использую хранилище очередей Azure для отправки электронных писем.Письма хранятся в хранилище очереди, и очередь отправляет 20 писем одновременно.

//Checks for messages inn the queue
foreach (CloudQueueMessage msgin sendEmailQueue.GetMessages(20, TimeSpan.FromSeconds(50)))
   {
        ProcessQueueMessage(msg);

   }

Проблема, с которой я столкнулся, заключается в том, что когда в очередь добавляется электронное письмо с неправильными данными SMTP (т. е. с неправильным паролем), сообщение остается в очереди, поскольку его не удается отправить, и предотвращает отправку других сообщений в очереди.

private void ProcessQueueMessage(CloudQueueMessage msg)
{
  try
  {
    //We try to send an email
    SendEmail(emailRowInMessageTable, htmlMessageBodyRef, textMessageBodyRef);

  } catch (SmtpException e)
  {
    string err = e.Message;

    //When an error occurs we check to see if the message failed to send certain no. of      
      times
    if (msg.DequeueCount > 10)
    {
      //We delete the message from queue
      sendEmailQueue.DeleteMessage(msg);

      return;
    } else
    {
      //delete from top of queue
      sendEmailQueue.DeleteMessage(msg);

      //insert into end of queue
      sendEmailQueue.AddMessage(msg);

      return;
    }
  }
 }

Решение, которое я пытался, заключалось в том, чтобы удалить сообщение из очереди, если была ошибка, и добавить его обратно к концу очереди, что приводит к тому, что отправляются правильные электронные письма.Но удаление и добавление сообщения обратно в очередь сбрасывает свой свойство dequeue, которое не идеально, поскольку я использую свойство Dequeue, чтобы убедиться, что сообщение не находится в очереди навсегда.

Каким будет лучшее решение в этой ситуации?

Это было полезно?

Решение 2

Раствор должен был использовать разные очереди для разных SMTP-серверов и запускать все из одной рабочей роли, используя несколько потоков.

Используется каркас здесь: http://www.31a2ba2a-b718-11dc-8314-0800200C9A66.com/2010/12/running-multiple-threads-on-windows.html для запуска нескольких нитей внутри одного работника.

Другие советы

Вам не обязательно удалять сообщение и добавлять его.Как только сообщение visibility timeout период (в вашем случае 50 секунд) истек, он автоматически появится обратно в очереди.Таким образом, ваш DequeueCount логика также будет работать, поскольку одно и то же сообщение выводится из очереди и снова ставится в очередь.

Обратите внимание, что очереди Windows Azure представляют собой FIFO с максимальной эффективностью...поэтому это не всегда необходимо, и сообщения будут выбираться на основе времени их добавления.Вы можете сделать несколько вещей:

  • Уменьшите количество повторов (на данный момент у вас 10, вы можете уменьшить его до 5) или
  • Проверьте фактическое исключение.Если процесс завершился неудачно из-за неправильных учетных данных, он завершится неудачно в следующий раз и в следующий раз после этого.Нет смысла повторять это сообщение.Вы можете просто переместить это сообщение в подозрительную очередь, чтобы иметь возможность проверить его позже.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top