2013-05-05 144 views
0

我正在嘗試學習Amazon SQS。我發送多個消息請求我的SQS像亞馬遜SQS中的郵件數量

sendMessage(sqs, qUrl, "message 1"); 
    sendMessage(sqs, qUrl, "message 2"); 
    sendMessage(sqs, qUrl, "message 3"); 
    sendMessage(sqs, qUrl, "message 4"); 
    sendMessage(sqs, qUrl, "message 5"); 

注:在我傳遞的參數,SQSqUrl都是一樣的。

//的sendMessage方法:

public void sendMessage(AmazonSQS sqs, String queueUrl, String msg){ 
     SendMessageRequest smr = new SendMessageRequest(queueUrl, msg); 
     sqs.sendMessage(smr); 
    } 

但仍當我嘗試在隊列計數numberOfRequests,它是1,而不是5

public int countRequests(AmazonSQS sqs, String queueUrl){ 
     // Receive messages 
     int numberOfMessages=0; 
     System.out.println("Receiving messages"); 
     ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); 
     messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); 
     for (Message message : messages) { 
      numberOfMessages++; 
      System.out.println(" Message"); 
      System.out.println(" MessageId:  " + message.getMessageId()); 
      System.out.println(" ReceiptHandle: " + message.getReceiptHandle()); 
      System.out.println(" MD5OfBody:  " + message.getMD5OfBody()); 
      System.out.println(" Body:   " + message.getBody()); 
      for (Entry<String, String> entry : message.getAttributes().entrySet()) { 
       System.out.println(" Attribute"); 
       System.out.println(" Name: " + entry.getKey()); 
       System.out.println(" Value: " + entry.getValue()); 
      } 
     } 
     return numberOfMessages; 
    } 

這裏

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); 
    messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); 

「消息」僅收到的最後一條消息,而不是第一個4

我的理解是,我應該有我的隊列中5個消息請求。我錯過了什麼?還是我錯誤地理解了?請糾正我。

回答

5

receiveMessage返回的消息數量不確定 - 爲了獲得更可靠的隊列大小計數,請使用getQueueAttributes並要求提供ApproximateNumberOfMessages。在此呼叫之前插入一個短暫的延遲時間,以便讓隊列時間處理您發送的消息。

+0

當我嘗試獲取QueueAttributes,如您所說,我看到「{Attributes:{}}」 – Prasanna 2013-05-05 15:36:02

+3

您是否在要返回的屬性列表中發送?查看[此線程](https://forums.aws.amazon.com/thread.jspa?threadID=70348)爲例 – 2013-05-05 15:51:01

5

默認情況下,ReceiveMessage將僅檢索單個消息。您可以傳遞MaxNumberOfMessages選項以在單個調用中檢索多個消息。

但是,請注意,即使您已將五條消息寫入隊列,即使您將MaxNumberOfMessages設置爲最大值10,也可能無法使用單個ReceiveMessage調用返回所有這些消息。這是因爲SQS實現有保證的交付方式 - 系統實際上將在許多服務器上存儲消息的許多副本,以確保即使服務器出現故障,您的消息仍能通過。您發佈的每條消息必須在許多服務器上的SQS系統內複製,並且該複製不是即時的。這就是爲什麼消息可能按順序到達,爲什麼ApproximateNumberOfMessages是近似值,以及爲什麼receiveMessage可能不會總是返回任意數量的消息。這首先是違反直覺的,但如果設計適當的系統,在實踐中對於許多使用情況無關緊要,而且SQS如何能夠提供如此高的可用性和可擴展性。

如果您重複調用receiveMessage,您將收到所有消息。