首页 > 代码库 > rabbitmq 学习记录 -- TTL

rabbitmq 学习记录 -- TTL

派猴子来的救兵

queue本身的TTL

注意, 这里说的是queue本身的TTL. 不是说里面的消息

声明一个队列的时候, 可以用x-expires指定队列的TTL值. 过期之后, 这个队列就被删掉了.

不管里面是不是还有消息没有消费

#!/usr/bin/env python# -*- coding: utf-8 -*-‘‘‘the queue exists for only 5 seconds, whether there is messages!‘‘‘import pikaimport sysdef main():    body = ‘ ‘.join(sys.argv[1:]) or ‘Hello World‘    connection = pika.BlockingConnection(        pika.ConnectionParameters(            host=‘localhost‘))    channel = connection.channel()    channel.queue_declare(queue=‘ttlhello‘,arguments={"x-expires":5000}) # ttl 5 second    channel.basic_publish(exchange=‘‘,                          routing_key=‘ttlhello‘,                          body=body,                          )    connection.close()if __name__ == ‘__main__‘:    main()

跑一下看看效果

# python queueTTL.py ;sleep 1; rabbitmqctl list_queues; sleep 6;rabbitmqctl list_queues  Listing queues ...  ttlhello    1  Listing queues ...  

Per-Queue Message TTL

这个也是队列的属性, 而不是消息的. 队列中的所有消息过了TTL就会被删除.

#!/usr/bin/env python# -*- coding: utf-8 -*-‘‘‘the messages in the queue exist for only 5 seconds‘‘‘import pikaimport sysdef main():    body = ‘ ‘.join(sys.argv[1:]) or ‘Hello World‘    connection = pika.BlockingConnection(        pika.ConnectionParameters(            host=‘localhost‘))    channel = connection.channel()    channel.queue_declare(queue=‘ttlmessagehello‘,arguments={"x-message-ttl":5000}) # ttl 5 second    channel.basic_publish(exchange=‘‘,                          routing_key=‘ttlmessagehello‘,                          body=body,                          )    connection.close()if __name__ == ‘__main__‘:    main()

跑一下看看效果

# python queueMessageTTL.py; rabbitmqctl list_queues; sleep 6; rabbitmqctl list_queues  Listing queues ...  ttlmessagehello 1  Listing queues ...  ttlmessagehello 0  

Per-Message TTL

发送消息的时候, 也可以给每条消息一个TTL的属性.

messageTTLSend.py

#!/usr/bin/env python# -*- coding: utf-8 -*-import pikaimport sysdef main():    body = ‘ ‘.join(sys.argv[1:]) or ‘Hello World‘    connection = pika.BlockingConnection(        pika.ConnectionParameters(            host=‘localhost‘))    channel = connection.channel()    channel.queue_declare(queue=‘hello‘)    channel.basic_publish(exchange=‘‘,                          routing_key=‘hello‘,                          body=body,                          properties=pika.BasicProperties(                              expiration="5000"                             )                          )    connection.close()if __name__ == ‘__main__‘:    main()

跑一下看看效果

# python messageTTLSend.py; rabbitmqctl list_queues; sleep 6; rabbitmqctl list_queues;  Listing queues ...  hello   1  Listing queues ...  hello   0  

最后, 如per-message ttl 和 per-queue message ttl不一样, 按小的来.

rabbitmq 学习记录 -- TTL