如何从SQS队列中获取所有消息,直到队列为空? [英] How to fetch all messages from SQS queue till the queue is empty?

查看:129
本文介绍了如何从SQS队列中获取所有消息,直到队列为空?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有以下代码:

    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条消息,那么我是否需要另一个循环?

This code returns 10 messages from my understanding. If the SQS queue has 1000 messages then do I need another loop ?

有没有办法知道SQS队列大小?

Is there a way to know the SQS queue size?

推荐答案

是的,您将需要另一个(外部)循环来继续获取10个批次的消息,直到没有剩余消息为止.您不需要知道队列的大小,只需使用while循环并进行迭代,直到获得没有消息的响应为止.

Yes you would need another (outer) loop to continue getting messages in batches of 10, until there were no messages left. You don't need to know the queue size for that, just use a while loop and iterate until get you get a response with no messages.

类似这样的东西:

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开发工具包查询队列属性 roximatenumberofmess .像:

If you do need to get the number of messages still in the queue you can query the AWS SDK for the queue attribute ApproximateNumberOfMessages. like:

GetQueueAttributesResult attrResult = sqs.getQueueAttributes(queueUrl, ["ApproximateNumberOfMessages"]);
System.out.println("Messages in queue: " + attrResult.getAttributes()["ApproximateNumberOfMessages"]);

这篇关于如何从SQS队列中获取所有消息,直到队列为空?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆