Pergunta

Eu estou usando uma azure fila de armazenamento para envio de e-mails.Os e-mails são armazenados no armazenamento de fila e a fila envia 20 e-mails de uma vez.

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

   }

O problema que eu estou tendo é que, quando um email é adicionado à fila de SMTP incorrecto detalhes(que eu.e palavra-passe errada), a mensagem permanece na fila de como ele falha ao enviar o e impede que outras mensagens na fila de envio.

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

A solução que eu tentei foi para apagar a mensagem da fila, se houve um erro e adicioná-lo de volta para o final da fila, resultando na correta de e-mails sendo enviados.Mas excluindo e adicionando a mensagem de volta para a fila, redefine seu dequeue propriedade que não é ideal desde que eu estou usando a fila de propriedade para se certificar de que uma mensagem não está na fila para sempre.

Qual seria a melhor solução para essa situação?

Foi útil?

Solução 2

A solução foi a utilização de diferentes fila para diferentes servidores SMTP e executar tudo a partir de uma função de trabalho com vários segmentos.

Utilizado o quadro aqui: http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/running-multiple-threads-on-windows.html para executar várias threads dentro de um único papel de trabalhador.

Outras dicas

Você realmente não tem para apagar a mensagem e adicioná-lo.Uma vez que a mensagem visibility timeout período (50 segundos no seu caso) tiver expirado, ele irá automaticamente aparecer de volta na fila.Desta forma, o seu DequeueCount a lógica também funcionaria como a mesma mensagem será e enfileirados novamente.

Por favor, note que o Windows Azure Filas são de melhor esforço FIFO ...por isso não é sempre necessário e que as mensagens serão escolhidos na base de um tempo eles foram adicionados.Você pode fazer algumas coisas:

  • Reduzir o número de tentativas (atualmente tem 10, você pode reduzi-lo a 5) ou
  • Verificar a real exceção.Se o processo falhou devido a credenciais incorrectas, ele irá falhar a próxima vez, e da próxima vez depois disso.Não há nenhum ponto de repetir a mensagem.Você pode simplesmente mover a mensagem para uma fila de suspeitas, de modo que você pode inspecionar a mensagem mais tarde.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top