2013-10-24 7 views
3

AWS SQS의 모든 메시지를 삭제하지 않고 C#을 사용하여 읽으려고하지만 마지막 메시지 하나만 받고 있습니다. 여기 C# AWS SQS 삭제하지 않고 모든 메시지 읽기

큐 데이터베이스 테이블하지 않는 코드

ReceiveMessageRequest rmr = new ReceiveMessageRequest(); 
     rmr.QueueUrl = url; 
     rmr.MaxNumberOfMessages = 10; 
     AmazonSQSClient sq = new AmazonSQSClient("xx", "yy"); 
     ReceiveMessageResponse rmrep = sq.ReceiveMessage(rmr); 
     ReceiveMessageResult rmres = rmrep.ReceiveMessageResult; 
     //DeleteMessageRequest dmr = new DeleteMessageRequest(); 

     string msgid = ""; 
     string rephandle = ""; 
     XmlDocument xl = new XmlDocument(); 

     for (int i = 0; i < rmres.Message.Count;i++) 
     { 
      rmrep = sq.ReceiveMessage(rmr); 
      rmres = rmrep.ReceiveMessageResult; 
      object y = JsonConvert.DeserializeObject<object>(rmres.Message[0].Body); 
      int z= y.add(); 
      MessageBox.Show(z.ToString()); 
     } 

답변

4

이고; 당신은 단지 '모든 메시지를 읽을 수 없습니다'. 당신은 SQS에게 몇 가지 메시지를 원한다고 말하고, 어떤 메시지를 골라 당신에게 보냅니다. 큐에있는 고유 한 메시지 목록을 통해 반복하여 제시하거나 예상 할 수는 없으며 이러한 목적으로 사용되지 않습니다.

1 또는 메시지를 읽고 삭제 (또는 다른 대기열에 넣음)하면 결국 모든 메시지를 읽을 수 있지만 삭제하지 않는 한 몇몇 메시지를 여러 번 되돌려 받음.

1

수신 메시지를 여러 번 호출 했으므로 일부 메시지가 표시되지 않습니다. 이런 식으로 코드를 변경합니다

AmazonSQSClient sq = new AmazonSQSClient("xx", "yy"); 
while (true) 
{ 
    ReceiveMessageRequest rmr = new ReceiveMessageRequest(); 
    rmr.QueueUrl = url; 
    rmr.MaxNumberOfMessages = 10; 
    ReceiveMessageResponse response= sq.ReceiveMessage(rmr); 

    foreach (Message message in response.ReceiveMessageResult.Message) 
    { 
     MessageBox.Show(message.ReceiptHandle + ": " + message.Body); 
    } 

} 

참고 : 큐에 충분한 메시지 (수는 큐에 의존하고 문서화되어 있지 않습니다), 당신이 있기 때문에 더 이상받을 수 없습니다가있는 경우 최대 개수의 기내 메시지에 도달하십시오.

다른 알림 :이 시간이 가시성 타임 아웃보다 길면 같은 메시지를 다시 받게됩니다.

+0

나는 message.Body를 구문 분석하기가 힘들며 내 데이터베이스에 저장하십시오. 어떤 코드 샘플도 도움이됩니까? – Amrik