如何从 AWS 中的 SQS 队列接收多于 1 条消息?
How to receive more than 1 message from an SQS queue in AWS?
我在 AWS SQS
.
中从我的队列接收超过 1 个 message/line 时遇到一点问题
这是我的代码:
import boto3
import boto
AWS_ACCESS_KEY = '*****'
AWS_SECRET_ACCESS_KEY = '******'
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))
如有任何帮助,我们将不胜感激。
谢谢!
receive_messages()
函数采用默认为 1 条消息的 MaxNumberOfMessages
参数。因此,您将需要询问更多消息。
然而,receive_messages()
documentation 指出:
MaxNumberOfMessages (integer) -- The maximum number of messages to return. Amazon SQS never returns more messages than this value (however, fewer messages might be returned). Valid values are 1 to 10. Default is 1.
因此,您可能无法在每次通话中收到全部消息。
示例:
import boto3
sqs = boto3.resource('sqs')
queue = sqs.get_queue_by_name(QueueName='my-queue-name')
messages = queue.receive_messages(MaxNumberOfMessages=10)
for message in messages:
print(message.body)
message.delete()
这里有一些代码(来自 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
我在 AWS SQS
.
这是我的代码:
import boto3
import boto
AWS_ACCESS_KEY = '*****'
AWS_SECRET_ACCESS_KEY = '******'
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))
如有任何帮助,我们将不胜感激。 谢谢!
receive_messages()
函数采用默认为 1 条消息的 MaxNumberOfMessages
参数。因此,您将需要询问更多消息。
然而,receive_messages()
documentation 指出:
MaxNumberOfMessages (integer) -- The maximum number of messages to return. Amazon SQS never returns more messages than this value (however, fewer messages might be returned). Valid values are 1 to 10. Default is 1.
因此,您可能无法在每次通话中收到全部消息。
示例:
import boto3
sqs = boto3.resource('sqs')
queue = sqs.get_queue_by_name(QueueName='my-queue-name')
messages = queue.receive_messages(MaxNumberOfMessages=10)
for message in messages:
print(message.body)
message.delete()
这里有一些代码(来自 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