문제

Azure Queue Storage를 사용하여 이메일을 보내고 있습니다.이메일은 대기열 저장소에 저장되며 대기열은 한 번에 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;
    }
  }
 }

내가 시도한 솔루션은 오류가 있으면 대기열에서 메시지를 삭제하고 큐의 끝에 다시 추가하여 올바른 이메일이 발송되는 것입니다.그러나 메시지를 큐에 다시 삭제하고 추가하면 Dequeue 속성을 사용하여 메시지가 큐에 영원히 없는지 확인하기 때문에 이상적이지 않은 Dequeue 속성을 재설정합니다.

이 상황에서 가장 좋은 해결책은 무엇입니까?

도움이 되었습니까?

해결책 2

해결책은 다른 대기열의 SMTP 서버에 대해 서로 다른 대기열을 사용하고 여러 스레드를 사용하여 한 작업자 역할에서 모두 실행하는 것이 었습니다.

여기에서 프레임 워크를 사용했습니다. http://www.31a2ba2a-b718-11dc9a66.com/2010/12/running-multiple-threads-on-windows.html 단일 작업자 역할 안에 여러 개의 스레드를 실행하십시오.

다른 팁

실제로 메시지를 삭제하고 추가할 필요는 없습니다.일단 메시지는 visibility timeout 기간(귀하의 경우 50초)이 만료되면 자동으로 대기열에 다시 나타납니다.이렇게 하면 당신의 DequeueCount 동일한 메시지가 대기열에서 제거되고 다시 대기열에 추가되면 논리도 작동합니다.

Windows Azure 대기열은 최선의 FIFO입니다.따라서 항상 필요한 것은 아니며 해당 메시지는 추가된 시간을 기준으로 선택됩니다.다음과 같은 몇 가지 작업을 수행할 수 있습니다.

  • 재시도 횟수를 줄이세요(현재 10회이며 5회까지 줄일 수 있습니다).
  • 실제 예외를 확인하세요.잘못된 자격 증명으로 인해 프로세스가 실패하면 다음 번에도 실패하고 그 이후에도 실패합니다.해당 메시지를 다시 시도해도 소용이 없습니다.나중에 메시지를 검사할 수 있도록 해당 메시지를 포이즌 큐로 이동할 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top