Python操作rabbitmq系列(四):根據類型訂閱消息

在上一章中,所有的接收端獲取的所有的消息。這一章,我們將討論,一些消息,仍然發送給所有接收端。其中,某個接收端,只對其中某些消息感興趣,它只想接收這一部分消息。如下圖:C1,只對error感興趣,C2對其他三種甚至對所有都感興趣,我們該怎麼搞呢?

發送端:

import pika

import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(

host=localhost))

channel = connection.channel()

# 創建一個交換機:direct_logs 類型是:direct

channel.exchange_declare(exchange=direct_logs, exchange_type=direct)

severity = sys.argv[1] if len(sys.argv) > 1 else info

message = .join(sys.argv[2:]) or Hello World!

# 向exchage按照設置的 routing_key=severity 發送message

channel.basic_publish(exchange=direct_logs,

routing_key=severity,

body=message)

print(" [x] Sent %r:%r" % (severity, message))

connection.close()

接收端:

import pika

import sys

connection = 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.queue

severities = 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()

效果圖:

注意:

基於這種模式和上一章,在發送端發消息之前,需要先將接收端啟動起來。為啥,前面說了,過期消息不感興趣,是不會接收的。

在做實驗的時候,需要注意


推薦閱讀:

TAG:RabbitMQ | 高並發 | Web開發 |