rabbitmq direct模式

publisher端:

import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host = "localhost"
))
channel = connection.channel()

channel.exchange_declare(exchange = "direct_logs",
                         exchange_type = "direct")
#声明交换器名称和类型

severity
= sys.argv[1] if len(sys.argv)>1 else "info" #severity可理解为一种类似于queue的队列,在sheell执行命令后可手动定义severity的名称,
若未输入则默认为info

message
="".join(sys.argv[2:]) or "hello world!" #在shell窗口执行命令时可手动定义(第二个数据)消息内容,若未输入则默认为“hello world”

channel.basic_publish(exchange
= "direct_logs", routing_key = severity, body = message) print(" [x] Sent %r:%r"%(severity,message)) connection.close()

subscriber端:

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(queue = "",exclusive = True)
queue_name =result.method.queue

severities = sys.argv[1:]
if not severities:
    sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0]) 
    sys.exit(1)

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,priperties,body):
    print(" [x] %r:%r" % (method.routing_key,body))

channel.basic_consume(on_message_callback = callback,
                      queue = queue_name,
                      auto_ack = True)
                    
channel.start_consuming()

direct模式中publisher端定义的名称与subcriber端定义的名称一一匹配,A类型只能接收A类型所定义的数据,B类型只能接收B类型。生活中人和人交配,青蛙和青蛙交配,不可能人与青蛙交配。

posted on 2020-09-28 11:50  行而下的坏死  阅读(219)  评论(0)    收藏  举报