我正在尝试从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条可用消息。
所以在这里我想从循环中获取队列中的所有消息。任何领导将不胜感激。感谢。
答案 0 :(得分:0)
当SQS队列中有少量消息时,特别是您的情况下极少数消息,您可能无法收到任何消息,可能需要重试该呼叫:
短轮询是默认行为,其中在接收消息调用上对加权随机机器集进行采样。因此,仅返回采样机器上的消息。如果队列中的消息数量很少(少于1,000),则很可能获得的消息数少于每次接收消息呼叫所请求的消息数。 如果队列中的消息数量非常小,您可能不会在特定的接收消息响应中收到任何消息。如果发生这种情况,请重复请求。
另外,一般来说,一旦收到一组邮件,你就处理它们然后删除你处理的邮件 - 为了测试目的,至少你可能想要在每个'print message.body'之后删除每条返回的邮件,在你发出下一个接收请求之前。
答案 1 :(得分:0)
您的问题:我想从循环中的队列中获取所有消息..............我的回答:(完全阅读)fifo队列。阅读该消息,然后将同一条消息发送回该队列,并将其从队列中删除..仅当您这样做(通过适当的hadelling和Message handler异常),这才是安全的。尝试使用适当的记录器编写python程序,并使其安全运行。实际上,您不是安全可靠的。