Question

Je suis à l'aide d'un azure file d'attente de stockage pour envoyer des e-mails.Les e-mails sont stockés dans la file d'attente de stockage et de la file d'attente envoie 20 e-mails à la fois.

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

   }

Le problème que j'ai c'est que quand un email est ajouté à la file d'attente SMTP incorrect de détails(j'.e mauvais mot de passe), le message reste dans la file d'attente comme il ne parvient pas à envoyer et empêche les autres messages dans la file d'attente d'envoi.

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

La solution que j'ai essayé de supprimer le message de la file d'attente si il y avait une erreur et l'ajouter de retour à la fin de la file d'attente qui en résulte dans le bon courriels envoyer.Mais la suppression et l'ajout de le message dans la file d'attente réinitialise son file d'attente à la propriété qui n'est pas idéal depuis que je suis à l'aide de la file d'attente à la propriété pour s'assurer qu'un message n'est pas dans la file d'attente pour toujours.

Ce serait la meilleure solution dans cette situation?

Était-ce utile?

La solution 2

La solution consistait à utiliser différentes file d'attente pour différents serveurs SMTP et à tout exécuter à partir d'un rôle travailleur à l'aide de plusieurs threads.

a utilisé le cadre ici: http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.fr/2010/12/Running-Multiple-threads-on-windows.html Pour exécuter plusieurs threads à l'intérieur d'un seul rôle travailleur.

Autres conseils

Vous n'avez donc pas à supprimer le message et l'ajouter.Une fois que le message de l' visibility timeout période (50 secondes dans votre cas) a expiré il apparaîtra automatiquement en arrière dans la file d'attente.De cette façon, votre DequeueCount la logique serait également travailler en tant que le même message est retiré et mis en file d'attente à nouveau.

Veuillez noter que Windows Azure Files d'attente sont des best-effort FIFO ...donc, il n'est pas toujours nécessaire et que les messages seront sélectionnés sur la base du temps, ils ont été ajoutés.Vous pourriez faire quelques petites choses:

  • Réduire le nombre de tentatives (actuellement, vous avez 10, vous pouvez le réduire à 5) ou
  • Vérifier exception.Si le processus a échoué en raison d'informations d'identification incorrectes, il ne sera pas la prochaine fois et la prochaine fois d'après.Il n'y a pas de point de réessayer ce message.Vous pouvez simplement déplacer le message dans un poison file d'attente de sorte que vous pouvez inspecter le message plus tard.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top