Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to receive more than 1 message from an SQS queue in AWS?

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!

like image 333
raxor2k Avatar asked Dec 09 '25 12:12

raxor2k


2 Answers

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()
like image 100
John Rotenstein Avatar answered Dec 12 '25 00:12

John Rotenstein


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

like image 36
Laren Crawford Avatar answered Dec 12 '25 00:12

Laren Crawford



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!