从 SQS 检索多条消息

2022-09-01 07:29:23

我在 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
 }

我也尝试过使用MaxNumberOfMessages,但没有这样的运气:

 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"));

以上总是在之前运行,并给我一个>1int

感谢您的输入


答案 1

AWS API 参考指南:查询/查询接收消息

由于队列的分布式特性,在 ReceiveMessage 调用上对一组加权随机计算机进行采样。这意味着仅返回采样计算机上的消息。如果队列中的消息数较少(小于 1000),则收到的消息数可能会少于每个 ReceiveMessage 调用请求的消息数。如果队列中的消息数非常少,则可能不会在特定的 ReceiveMessage 响应中收到任何消息。在这种情况下,您应该重复该请求。

最大消息数:要返回的最大消息数。SQS 永远不会返回超过此值的消息,但可能会返回较少的消息


答案 2

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

SQS将消息的副本存储在多个服务器上,并通过以下两种可能的策略之一向这些服务器发送消息请求,

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

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


推荐