2012-03-31 89 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 
...