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 pika
import sys
def 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 pika
import sys
def 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 pika
import sys
def 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不一样, 按小的来.