Python操作rabbitmq系列(四):根據類型訂閱消息
05-11
在上一章中,所有的接收端獲取的所有的消息。這一章,我們將討論,一些消息,仍然發送給所有接收端。其中,某個接收端,只對其中某些消息感興趣,它只想接收這一部分消息。如下圖:C1,只對error感興趣,C2對其他三種甚至對所有都感興趣,我們該怎麼搞呢?
發送端:
import pika
import sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host=localhost))
channel = connection.channel()# 創建一個交換機:direct_logs 類型是:directchannel.exchange_declare(exchange=direct_logs, exchange_type=direct)severity = sys.argv[1] if len(sys.argv) > 1 else infomessage = .join(sys.argv[2:]) or Hello World!# 向exchage按照設置的 routing_key=severity 發送messagechannel.basic_publish(exchange=direct_logs, routing_key=severity, body=message)print(" [x] Sent %r:%r" % (severity, message))
connection.close()接收端:
import pika
import sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host=localhost))channel = connection.channel()# 跟發送端一致channel.exchange_declare(exchange=direct_logs, exchange_type=direct)# 還是聲明臨時隊列result = channel.queue_declare(exclusive=True)
queue_name = result.method.queueseverities = sys.argv[1:]if not severities: sys.stderr.write("Usage: %s [info] [warning] [error]" % sys.argv[0]) sys.exit(1)# 使用routing_key綁定交換機和隊列。廣播類型,無需使用這個# direct類型:會對消息進行精確匹配# 對個隊列使用相同路由key是可以的for severity in severities:
channel.queue_bind(exchange=direct_logs,
queue=queue_name, routing_key=severity)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(callback, queue=queue_name, no_ack=True)channel.start_consuming()
效果圖:
注意:
基於這種模式和上一章,在發送端發消息之前,需要先將接收端啟動起來。為啥,前面說了,過期消息不感興趣,是不會接收的。
在做實驗的時候,需要注意
推薦閱讀: