質問

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;
    }
  }
 }
.

私が試した解決策は、エラーが発生して追加した場合にキューからメッセージを削除することでした キューの最後に戻ると、正しいEメールが送信されます。しかし追加の削除と追加 キューに戻るメッセージは、理想的ではないデキュープロパティをリセットします メッセージが永遠にキューに入っていないことを確認するためにDequeueプロパティを使用しているので。

この状況に最適な解決策は何でしょうか?

役に立ちましたか?

解決 2

ソリューションは、異なるSMTPサーバーに対して異なるキューを使用し、複数のスレッドを使用して1つのワーカーロールからそれを実行することでした。

ここにフレームワークを使用しました: http://www.31a2ba2a-b718-11dc-8314-0800200C9a66.2010/12/running-multiple-threads-on-windows.html 単一のワーカーロール内で複数のスレッドを実行する。

他のヒント

メッセージを削除して追加する必要はありません。メッセージのvisibility timeout期間(あなたのケースで50秒)が期限切れになると、自動的にキューに戻ります。このようにして、DequeueCountロジックは同じメッセージがデキューされ、再度エンキューされているので機能します。

Windows AzureキューはベストエフォートFIFO ...だから、必ずしも必要ではなく、メッセージが追加された時間に基づいてメッセージが選択されることに注意してください。あなたはいくつかのことができる:

  • 再試行回数を減らす(現在は10をご希望の場合は、5ページに縮小できます)または
  • 実際の例外を確認してください。クレデンシャルが正しくないためにプロセスが失敗した場合は、次回とその後次回は失敗します。そのメッセージを再試行している点はありません。後でメッセージを調べることができるように、そのメッセージを毒キューブに移動するだけで
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top