从SQS检索多条消息

sdo*_*lgy 26 java amazon-sqs amazon-web-services

我在SQS中有多条消息.以下代码始终只返回一个,即使有几十个可见(不在飞行中). setMaxNumberOfMessages我认为会允许多次一次消费..我误解了吗?

 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
 }
Run Code Online (Sandbox Code Playgroud)

我也试过使用withMaxNumberOfMessages而没有任何运气:

 receiveMessageRequest.withMaxNumberOfMessages(10);
Run Code Online (Sandbox Code Playgroud)

我怎么知道队列中有消息?超过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"));
Run Code Online (Sandbox Code Playgroud)

以上总是先行,并给我一个int> 1

感谢您的输入

sdo*_*lgy 32

AWS API参考指南:Query/QueryReceiveMessage

由于队列的分布式特性,在ReceiveMessage调用上对加权随机机器集进行采样.这意味着只返回采样机器上的消息.如果队列中的消息数量很少(小于1000),则可能会获得比每次ReceiveMessage调用请求的消息少的消息.如果队列中的消息数量非常小,您可能不会在特定的ReceiveMessage响应中收到任何消息; 在这种情况下,您应该重复该请求.

MaxNumberOfMessages:要返回的最大消息数.SQS永远不会返回比此值更多的消息,但可能会返回更少的消息.


Cao*_*lte 8

SQS参考文档中对此(可以说是相当特殊的)行为有一个全面的解释.

SQS在多个服务器上存储消息副本,并使用两种可能策略之一接收对这些服务器的消息请求,

  • 短轮询:默认行为,只有服务器的一个子集(基于加权随机分布)进行查询.
  • 长轮询:通过将WaitTimeSeconds属性设置为非零值启用,将查询所有服务器.

在实践中,对于我的有限测试,我似乎总是像你一样得到一条短轮询的消息.


wis*_*cky 5

我有同样的问题。您的队列的接收消息等待时间是多少?当我的为 0 时,即使队列中有 8 条消息,它也只返回 1 条消息。当我增加接收消息等待时间时,我得到了所有这些。对我来说似乎有点马车。


小智 5

我只是在尝试相同的方法,在这两个属性 setMaxNumberOfMessages 和 setWaitTimeSeconds 的帮助下,我能够获得 10 条消息。

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
                      receiveMessageRequest.setMaxNumberOfMessages(10);
                      receiveMessageRequest.setWaitTimeSeconds(20);
Run Code Online (Sandbox Code Playgroud)

o/p 快照:

Receiving messages from TestQueue.
Number of messages:10
Message
MessageId:     31a7c669-1f0c-4bf1-b18b-c7fa31f4e82d 
...
Run Code Online (Sandbox Code Playgroud)