Я использую лазурное хранилище очереди для отправки электронных писем. Электронные письма хранятся в хранилище очереди, и очередь отправляет 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, чтобы убедиться, что сообщение не находится в очереди навсегда.
Каким было бы лучшее решение в этой ситуации?