代码之家  ›  专栏  ›  技术社区  ›  Tanvi Jaywant

如何从SQS队列获取所有消息,直到队列为空?

  •  0
  • Tanvi Jaywant  · 技术社区  · 7 年前

    假设我有以下代码:

        final ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
        receiveMessageRequest.withMaxNumberOfMessages(10);
        final List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
        for (final Message message : messages) {
            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 (final Entry<String, String> entry : message.getAttributes().entrySet()) {
                System.out.println("Attribute");
                System.out.println("  Name:  " + entry.getKey());
                System.out.println("  Value: " + entry.getValue());
            }
        }
    

    根据我的理解,这段代码返回10条消息。如果SQS队列有1000条消息,那么我需要另一个循环吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Mark B    7 年前

    是的,您需要另一个(外部)循环来继续以10个为一批获取消息,直到没有消息留下。您不需要知道队列大小,只需使用while循环并迭代,直到得到没有消息的响应。

    像这样:

    ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
    receiveMessageRequest.withMaxNumberOfMessages(10);
    List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
    while (messages.size() > 0) {
        for (final Message message : messages) {
            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 (final Entry<String, String> entry : message.getAttributes().entrySet()) {
                System.out.println("Attribute");
                System.out.println("  Name:  " + entry.getKey());
                System.out.println("  Value: " + entry.getValue());
            }
        }
    
        receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
        receiveMessageRequest.withMaxNumberOfMessages(10);
        messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
    }
    

    如果您确实需要获取仍在队列中的消息数,可以在AWS SDK中查询queue属性 ApproximateNumberOfMessages

    GetQueueAttributesResult attrResult = sqs.getQueueAttributes(queueUrl, ["ApproximateNumberOfMessages"]);
    System.out.println("Messages in queue: " + attrResult.getAttributes()["ApproximateNumberOfMessages"]);
    
        2
  •  0
  •   sachin k    5 年前

    没有消息/空消息可能是误导。检索可能由于不同的原因而没有发生,例如- 另一个使用者轮询导致可见性超时 SQS基础设施的分布式特性