2012-03-31 96 views
20

我在SQS中有多條消息。以下代碼總是只返回一個,即使有幾十個可見(不在飛行中)。 setMaxNumberOfMessages我以爲會允許多個消費立即..我誤解了這一點?從SQS中檢索多條消息

CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName(queueName); 
String queueUrl = sqs.createQueue(createQueueRequest).getQueueUrl(); 
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); 
receiveMessageRequest.setMaxNumberOfMessages(10); 
List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); 
for (Message message : messages) { 
     // i'm a message from SQS 
} 

我使用withMaxNumberOfMessages沒有任何這樣的運氣也試過:

receiveMessageRequest.withMaxNumberOfMessages(10); 

我怎麼知道有消息在隊列中?超過1?

Set<String> attrs = new HashSet<String>(); 
attrs.add("ApproximateNumberOfMessages"); 
CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName(queueName); 
GetQueueAttributesRequest a = new GetQueueAttributesRequest().withQueueUrl(sqs.createQueue(createQueueRequest).getQueueUrl()).withAttributeNames(attrs); 
Map<String,String> result = sqs.getQueueAttributes(a).getAttributes(); 
int num = Integer.parseInt(result.get("ApproximateNumberOfMessages")); 

上面總是先運行,並給了我一個int是> 1個

感謝您的輸入

回答

27

AWS API Reference Guide: Query/QueryReceiveMessage

由於隊列的分佈式特性,在ReceiveMessage調用上採樣加權的隨機機器集合。這意味着僅返回採樣機器上的消息。如果隊列中的消息數量很少(小於1000),那麼您可能會收到的消息數少於每ReceiveMessage呼叫請求的消息數。如果隊列中的消息數量非常少,則可能不會收到特定ReceiveMessage響應中的任何消息;在這種情況下,您應該重複請求。

MaxNumberOfMessages:消息返回的最大數量。 SQS永遠不會返回比此值更多的消息,但可能會返回更少的

+1

您參考鏈接現在不工作,請你更新呢?我想這是http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/AmazonSQSClient.html#receiveMessage(java.lang.String) – coderz 2015-04-27 09:40:51

1

receiveMessageRequest.withMaxNumberOfMessages(10);

只是要清楚,這樣做的更加實用的用途是添加到您的構造是這樣的:

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl).withMaxNumberOfMessages(10); 

否則,你可能也只是做:

receiveMessageRequest.setMaxNumberOfMessages(10); 

這就是說,改變這將無助於原來的問題。

4

我有同樣的問題。你的隊列的接收消息等待時間是多少?當我在0時,即使隊列中有8個,它也只返回1條消息。當我增加了接收消息等待時間時,我得到了所有這些。對我來說似乎有點兒車。

6

SQS reference documentation中對此(可以說是相當特殊的)行爲有一個全面的解釋。

SQS stores copies of messages on multiple servers和接收消息請求到這些服務器取得與two possible strategies之一,

  • 短輪詢:默認行爲,只有服務器(基於加權隨機分佈)是的一個子集詢問
  • 長查詢:通過將WaitTimeSeconds屬性設置爲非零值啓用,查詢所有服務器

在實踐中,對於我有限的測試,我總是會像以前一樣得到一個短輪詢的消息。

0

我只是想同樣的,在這兩個屬性setMaxNumberOfMessages和setWaitTimeSeconds的幫助下,我能夠獲得10條消息。

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); 
         receiveMessageRequest.setMaxNumberOfMessages(10); 
         receiveMessageRequest.setWaitTimeSeconds(20); 

快照O/P的:

Receiving messages from TestQueue. 
Number of messages:10 
Message 
MessageId:  31a7c669-1f0c-4bf1-b18b-c7fa31f4e82d 
...