Как получить все сообщения из очереди SQS, пока очередь не станет пустой? - PullRequest
0 голосов
/ 20 сентября 2018

Скажите, у меня есть следующий код:

    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 сообщений, нужен ли мне еще один цикл?

Есть ли способ узнать размер очереди SQS?

1 Ответ

0 голосов
/ 20 сентября 2018

Да, вам понадобится другой (внешний) цикл, чтобы продолжать получать сообщения партиями по 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 атрибут очереди ApproximateNumberOfMessages.как:

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