Frage

Ich verwende einen Azure-Warteschlangenspeicher zum Senden von E-Mails.Die E-Mails werden im Warteschlangenspeicher gespeichert und die Warteschlange sendet jeweils 20 E-Mails.

//Checks for messages inn the queue
foreach (CloudQueueMessage msgin sendEmailQueue.GetMessages(20, TimeSpan.FromSeconds(50)))
   {
        ProcessQueueMessage(msg);

   }

Das Problem, das ich habe, ist, dass beim Hinzufügen einer E-Mail zur Warteschlange mit falschen SMTP-Details (dh falschem Kennwort) die Nachricht in der Warteschlange verbleibt, da sie nicht gesendet werden kann, und verhindert, dass andere Nachrichten in der Warteschlange gesendet werden.

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

Die Lösung, die ich versucht habe, bestand darin, die Nachricht aus der Warteschlange zu löschen, wenn ein Fehler aufgetreten ist, und sie hinzuzufügen zurück zum Ende der Warteschlange, was dazu führt, dass die richtigen E-Mails gesendet werden.Aber Löschen und Hinzufügen die Nachricht, die in die Warteschlange zurückkehrt, setzt ihre Warteschlangeneigenschaft zurück, was nicht ideal ist da ich die Eigenschaft dequeue verwende, um sicherzustellen, dass sich eine Nachricht nicht für immer in der Warteschlange befindet.

Was wäre die beste Lösung in dieser Situation?

War es hilfreich?

Lösung 2

Die Lösung bestand darin, verschiedene Warteschlangen für verschiedene SMTP-Server zu verwenden und alle von einer Arbeiterrolle mit mehreren Threads auszuführen.

das Framework hier verwendet: http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/1ning-multiple-threads-on-windows.html , um mehrere Threads in einer einzelnen Arbeiterrolle auszuführen.

Andere Tipps

Sie müssen die Nachricht nicht wirklich löschen und hinzufügen.Sobald die Nachricht visibility timeout der Zeitraum (in Ihrem Fall 50 Sekunden) ist abgelaufen und wird automatisch wieder in der Warteschlange angezeigt.Auf diese Weise Ihre DequeueCount logik würde auch funktionieren, wenn dieselbe Nachricht aus der Warteschlange genommen und erneut eingereiht wird.

Bitte beachten Sie, dass Windows Azure-Warteschlangen Best-Effort-FIFO sind...es ist also nicht immer notwendig und Nachrichten werden auf der Grundlage des Zeitpunkts ausgewählt, zu dem sie hinzugefügt wurden.Sie könnten ein paar Dinge tun:

  • Reduzieren Sie die Anzahl der Wiederholungen (derzeit haben Sie 10, Sie können sie auf 5 reduzieren) oder
  • Überprüfen Sie auf tatsächliche Ausnahme.Wenn der Prozess aufgrund falscher Anmeldeinformationen fehlgeschlagen ist, schlägt er das nächste Mal und das nächste Mal danach fehl.Es hat keinen Sinn, diese Nachricht noch einmal zu versuchen.Sie können diese Nachricht einfach in eine Vergiftungswarteschlange verschieben, damit Sie die Nachricht später überprüfen können.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top