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类型。生活中人和人交配,青蛙和青蛙交配,不可能人与青蛙交配。
浙公网安备 33010602011771号