我使用azure队列存储来发送电子邮件。电子邮件存储在队列存储中,队列一次发送20封电子邮件。
//Checks for messages inn the queue
foreach (CloudQueueMessage msgin sendEmailQueue.GetMessages(20, TimeSpan.FromSeconds(50)))
{
ProcessQueueMessage(msg);
}
我遇到的问题是,当一封电子邮件被添加到队列时,其中包含不正确的SMTP详细信息(即密码错误),该邮件会因为无法发送而留在队列中,并阻止队列中的其他邮件发送。 / p>
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属性来确保消息永远不在队列中。
在这种情况下,最佳解决方案是什么?
答案 0 :(得分:1)
您不必删除邮件并添加邮件。消息的visibility timeout
期(在您的情况下为50秒)过期后,它将自动显示回队列中。这样,您的DequeueCount
逻辑也可以在同一消息出列并再次入队时起作用。
请注意,Windows Azure队列是尽力而为的FIFO ...因此并不总是必要的,并且将根据添加的时间选择消息。你可以做一些事情:
答案 1 :(得分:0)
解决方案是对不同的SMTP服务器使用不同的队列,并使用多个线程从一个辅助角色运行它。
使用此处的框架:http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/running-multiple-threads-on-windows.html在单个辅助角色中运行多个线程。