I have a little problem receiving more than 1 message/line from my queue in AWS SQS.
Here is my code:
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))
Any Help would be much appreciated as to why. Thanks!
The receive_messages() function takes a MaxNumberOfMessages parameter that defaults to 1 message. Therefore, you will need to ask for more messages.
However, the receive_messages() documentation states:
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.
Therefore, you might not receive the full quantity of messages on each call.
Example:
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()
Here's some code (from a larger example on GitHub) that shows how to receive multiple messages:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With