Azureキューストレージはキューメッセージを送信しません
-
21-12-2019 - |
質問
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ページに縮小できます)または
- 実際の例外を確認してください。クレデンシャルが正しくないためにプロセスが失敗した場合は、次回とその後次回は失敗します。そのメッセージを再試行している点はありません。後でメッセージを調べることができるように、そのメッセージを毒キューブに移動するだけで