从AWS FIFO SQS获取所有消息

时间:2017-09-06 06:40:05

标签: python-2.7 amazon-web-services boto3 amazon-sqs fifo

我正在尝试从FIFO sqs队列中获取消息。以下是示例代码:

import boto3

sqs_client = 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 = 'test_queue.fifo'

response = sqs_client.create_queue(
    QueueName=queue_name,
    Attributes={
        'FifoQueue': 'true',
        'ContentBasedDeduplication': 'true'
        }
        )


for i in range(0,50):
    status = response.send_message(MessageBody = 'This is test message #'+str(i), MessageGroupId='586474de88e03')

while True:
    messages = response.receive_messages(MaxNumberOfMessages=10)
    if len(messages)>0:

        for message in messages:
            print message.body

    else:

        print('Queue is now empty')
        break

但我得到的只是前10条消息,然后显示“Queue现在为空”,尽管我可以看到AWS控制台队列中有40条可用消息。

所以在这里我想从循环中获取队列中的所有消息。任何领导将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

当SQS队列中有少量消息时,特别是您的情况下极少数消息,您可能无法收到任何消息,可能需要重试该呼叫:

  

短轮询是默认行为,其中在接收消息调用上对加权随机机器集进行采样。因此,仅返回采样机器上的消息。如果队列中的消息数量很少(少于1,000),则很可能获得的消息数少于每次接收消息呼叫所请求的消息数。 如果队列中的消息数量非常小,您可能不会在特定的接收消息响应中收到任何消息。如果发生这种情况,请重复请求

另外,一般来说,一旦收到一组邮件,你就处理它们然后删除你处理的邮件 - 为了测试目的,至少你可能想要在每个'print message.body'之后删除每条返回的邮件,在你发出下一个接收请求之前。

答案 1 :(得分:0)

您的问题:我想从循环中的队列中获取所有消息..............我的回答:(完全阅读)fifo队列。阅读该消息,然后将同一条消息发送回该队列,并将其从队列中删除..仅当您这样做(通过适当的hadelling和Message handler异常),这才是安全的。尝试使用适当的记录器编写python程序,并使其安全运行。实际上,您不是安全可靠的。