如何从AWS中的SQS队列接收多条消息?

时间:2017-06-11 10:58:34

标签: python amazon-web-services amazon-sqs

我在AWS SQS的队列中收到多条消息/行时遇到一些问题。

这是我的代码:

import boto3
import boto

AWS_ACCESS_KEY = 'AKIAJ65AZZZZRIQSQWA'
AWS_SECRET_ACCESS_KEY = 'xd+2ZfwIRj2yUuoLQNunMaFDdEJlzNzv'

sqs = boto3.resource('sqs', aws_access_key_id=AWS_ACCESS_KEY,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    region_name='us-east-2'
)

queue_name = 'Messages.fifo'
queue = sqs.get_queue_by_name(QueueName=queue_name)
messages = queue.receive_messages()


for message in messages:
    print('Body: {0}'.format(message.body))

任何帮助将非常感谢为什么。 谢谢!

2 个答案:

答案 0 :(得分:3)

receive_messages()函数采用MaxNumberOfMessages参数,默认为1条消息。因此,您需要索取更多信息。

然而,receive_messages() documentation州:

  

MaxNumberOfMessages (整数) - 要返回的最大邮件数。 Amazon SQS永远不会返回比此值更多的消息(但是,可能会返回更少的消息)。有效值为1到10.默认值为1.

因此,您可能无法在每次通话时收到全部信息。

答案 1 :(得分:0)

下面是一些代码(来自GitHub的一个较大示例),显示了如何接收多条消息:

import logging

import boto3
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)
sqs = boto3.resource('sqs')

def receive_messages(queue, max_number, wait_time):
    """
    Receive a batch of messages in a single request from an SQS queue.
    :param queue: The queue from which to receive messages.
    :param max_number: The maximum number of messages to receive. The actual number
                       of messages received may be less.
    :param wait_time: The maximum time to wait (in seconds) before returning. When
                      this number is greater than zero, long polling is used. This
                      can result in reduced costs and fewer false empty responses.
    :return: The list of Message objects received. These each contain the body
             of the message and metadata and custom attributes.
    """
    try:
        messages = queue.receive_messages(
            MessageAttributeNames=['All'],
            MaxNumberOfMessages=max_number,
            WaitTimeSeconds=wait_time
        )
        for msg in messages:
            logger.info("Received message: %s: %s", msg.message_id, msg.body)
    except ClientError as error:
        logger.exception("Couldn't receive messages from queue: %s", queue)
        raise error
    else:
        return messages

相关问题