【问题标题】:Azure Queue storage not sending queue messageAzure 队列存储不发送队列消息
【发布时间】:2014-01-28 08:14:15
【问题描述】:

我正在使用 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 属性来确保消息不会永远在队列中。

在这种情况下最好的解决方案是什么?

【问题讨论】:

    标签: c# azure smtp azure-storage azure-storage-queues


    【解决方案1】:

    您实际上不必删除并添加消息。一旦消息的visibility timeout 期限(在您的情况下为 50 秒)到期,它将自动出现在队列中。这样一来,您的 DequeueCount 逻辑也可以在同一条消息出队并再次入队时工作。

    请注意,Windows Azure 队列是尽力而为的 FIFO ......所以它并不总是必要的,并且将根据添加时间来挑选消息。你可以做几件事:

    • 减少重试次数(目前有10次,可以减少到5次)或
    • 检查实际异常。如果该过程由于不正确的凭据而失败,它将在下一次和下一次之后失败。重试该消息毫无意义。您可以将该消息移入有害队列,以便稍后检查该消息。

    【讨论】:

    • 据我了解,如果前 30 条消息阻塞队列(即错误密码),则不会发送下 20 条正确消息,因为前 30 条消息始终在队列中。这就是为什么我要删除前 30 条消息并将其添加到队列末尾以便可以发送 20 条正确消息。
    • 更新了我的答案。 HTH。
    • 我们已经检查了错误的邮件,例如不正确的电子邮件 ID 等,并将其移至有毒队列。不正确的密码只是一个例子,我更多地考虑 SMTP 服务器何时关闭等。我将更详细地解释我们的解决方案。我们有几个 SMTP 服务器,我们决定使用两个队列来处理消息。第一个将尝试消息 5 次,如果失败则将其移至第二个队列。第一个队列将每分钟尝试一次消息,而第二个队列我们希望每 60 分钟尝试一次消息。
    • .... 我们只想使用一个工作角色来执行此操作。关于最佳解决方案的任何想法?顺便说一句,感谢您的帮助。
    • 您当然可以在单个工作人员角色中执行此操作。看起来您需要一个 cron 作业类型的功能,使用它可以触发 2 个作业:一个每分钟触发一次,另一个每 60 分钟触发一次。请查看 Quartz.net 库 (quartznet.sourceforge.net)。您可能还会发现这篇文章对实施计划任务很有用:gauravmantri.com/2013/01/23/…。 HTH。
    【解决方案2】:

    解决方案是为不同的 SMTP 服务器使用不同的队列,并使用多个线程从一个工作角色运行。

    在这里使用了框架:http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/running-multiple-threads-on-windows.html 在单个工作者角色中运行多个线程。

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2014-08-30
      相关资源
      最近更新 更多