2014-01-09 4 views
2

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

//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, чтобы убедиться, что сообщение не находится в очереди навсегда.

Что было бы лучшим решением в этой ситуации?

ответ

0

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

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

1

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

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

  • Сократить число повторных попыток (в настоящее время у вас есть 10, вы можете уменьшить его до 5) или
  • Проверки на фактическое исключение. Если процесс завершился неудачно из-за неправильных учетных данных, он не будет работать в следующий раз и в следующий раз после этого. Нет смысла повторять это сообщение. Вы можете просто перенести это сообщение в ядовитую очередь, чтобы позже вы могли проверить это сообщение.
+0

Из моего понимания, если первое сообщение 30 блокирует очередь (т. Е. Неправильный пароль), следующее 20 правильное сообщение не будет отправлено, так как первые 30 сообщений всегда находятся в очереди. Поэтому я хочу удалить первые 30 сообщений и добавить их в конец очереди, чтобы можно было отправить 20 правильных сообщений. – Kaladin

+0

Обновлен мой ответ. НТН. –

+0

Мы уже проверяем наличие плохих сообщений, таких как неправильный идентификатор электронной почты и т. Д., И переместите его в ядовитую очередь. Неправильный пароль был всего лишь примером, я думал больше о том, когда серверы SMTP недоступны и т. Д. Я объясню наше решение немного подробнее. У нас есть несколько SMTP-серверов, и мы решили использовать две очереди для обработки сообщения. Первое будет пытаться отправить сообщение 5 раз, и если оно не удастся переместить его во вторую очередь. Первая очередь будет проверять сообщение каждую минуту, а вторая очередь - на каждые 60 минут. – Kaladin

Смежные вопросы