官方文档:https://www.rabbitmq.com/tutorials/tutorial-five-python.html
允许队列根据多个规则订阅消息。
发送到 topic 类型的 exchange 的消息的 routing_key 必须由被点分隔的词组成,长度不能超过 255 字节。
绑定键的格式也必须是相同的格式。
queue 和 exchange 间有两种特殊的绑定键:
* (星号) 只能替换 1 个条件。
# (井号) 可替换 0 或多个条件。
例如发送描述动物的消息,消息的 routing key 的格式:<celerity>.<colour>.<species>
Q1 感兴趣于所有橘色的动物。
Q2 感兴趣于兔子和所有懒惰的动物。
而消息"lazy.orange.male.rabbit" 会被丢弃,即便前面的 3 个条件可被匹配。
以下程序中,exchange 的类型为 topic,消息的 routing key 的格式为 “<facility>.<severity>”
emit_log_topic.py
#!/usr/bin/env python
import pika
import sys
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='topic_logs', exchange_type='topic')
routing_key = sys.argv[1] if len(sys.argv) > 2 else 'anonymous.info'
message = ' '.join(sys.argv[2:]) or 'Hello World!'
channel.basic_publish(
exchange='topic_logs', routing_key=routing_key, body=message)
print(" [x] Sent %r:%r" % (routing_key, message))
connection.close()
receive_logs_topic.py
#!/usr/bin/env python
import pika
import sys
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='topic_logs', exchange_type='topic')
result = channel.queue_declare('', exclusive=True)
queue_name = result.method.queue
binding_keys = sys.argv[1:]
if not binding_keys:
sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0])
sys.exit(1)
for binding_key in binding_keys:
channel.queue_bind(
exchange='topic_logs', queue=queue_name, routing_key=binding_key)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body))
channel.basic_consume(
queue=queue_name, on_message_callback=callback, auto_ack=True)
channel.start_consuming()
运行结果:
接收所有的消息
$ python3 receive_logs_topic.py "#"
[*] Waiting for logs. To exit press CTRL+C
[x] 'kern.critical':b'A critical kernel error'
接收所有 acility 为 “kern” 的消息
$ python3 receive_logs_topic.py "kern.*"
[*] Waiting for logs. To exit press CTRL+C
[x] 'kern.critical':b'A critical kernel error'
接收所有 severity 为 “critical” 的消息
$ python3 receive_logs_topic.py "*.critical"
[*] Waiting for logs. To exit press CTRL+C
[x] 'kern.critical':b'A critical kernel error'
接收所有 acility 为 “kern”,或 severity 为 “critical” 的消息
$ python3 receive_logs_topic.py "kern.*" "*.critical"
[*] Waiting for logs. To exit press CTRL+C
[x] 'kern.critical':b'A critical kernel error'
routing key 为 “kern.critical”
$ python3 emit_log_topic.py "kern.critical" "A critical kernel error"
[x] Sent 'kern.critical':'A critical kernel error'