rabbitmq学习笔记-----exchange的Direct类型(type=direct)消息路由
- 回顾:
上一节我们通过设置exchange为fanout,实现了将同一个Message deliver到多个Consumer中,这一节,我们来实现不同的消息 deliver到特定的Consumer中
- 本节内容要实现的数据流图最终如下:

-
Bindings绑定
绑定其实就是关联了exchange和queue。或者这么说:queue对exchagne的内容感兴趣,exchange要把它的Message deliver到queue中。实际上,绑定可以带routing_key 这个参数。其实这个参数的名称和basic_publish 的参数名是相同了。为了避免混淆,我们把它成为binding key
使用一个key来创建binding :
channel.queue_bind(exchange=exchange_name,queue=queue_name, routing_key='black')
注意:对于fanout的exchange来说,这个参数是被忽略的
-
Direct exchange
Direct exchange的路由算法非常简单:通过binding key的完全匹配

exchange X和两个queue绑定在一起。Q1的binding key是orange。Q2的binding key是black和green。当P publish key是orange时,exchange会把它放到Q1。如果是black或者green那么就会到Q2。其余的Message都会被丢弃
- Multiple bindings
多个queue绑定同一个key是可以的。对于下图的例子,Q1和Q2都绑定了black。也就是说,对于routing key是black的Message,会被deliver到Q1和Q2。其余的Message都会被丢弃

- 实现的效果
error的消息全部转到一个新建的queue中,error、info、warnging的消息全部转到另一个新建的queue中
consume端:
error.py
from amqplib import client_0_8 as amqp import time ##创建con和chanel con = amqp.Connection(host="192.168.1.188:32769", userid="guest", password="guest", virtual_host="/") chan = con.channel() result = chan.queue_declare(exclusive=True) chan.exchange_declare(exchange='log',type='direct') chan.queue_bind(queue=result[0],exchange='log',routing_key='error') def recv_callback(msg): print('我已经把收到消息:' + msg.body + '它来自'+ str(msg.channel.channel_id)+',并且我已存入磁盘!!!') chan.basic_consume(queue=result[0],callback=recv_callback,no_ack=True) while True: chan.wait() chan.close() con.close()
all.py
from amqplib import client_0_8 as amqp import time import sys ##创建con和chanel con = amqp.Connection(host="192.168.1.188:32769", userid="guest", password="guest", virtual_host="/") chan = con.channel() result = chan.queue_declare(exclusive=True) chan.exchange_declare(exchange='log',type='direct') severities = sys.argv[1:] if not severities: print(sys.stderr, "Usage: %s [info] [warning] [error]" %(sys.argv[0],)) exit() for serve in severities: chan.queue_bind(queue=result[0],exchange='log',routing_key=serve) def recv_callback(msg): print('屏幕打印消息:' + msg.body + '它来自'+ str(msg.channel.channel_id)) chan.basic_consume(queue=result[0],callback=recv_callback,no_ack=True) while True: chan.wait() chan.close() con.close()
product端:
product.py
from amqplib import client_0_8 as amqp import sys ##创建con和chanel con = amqp.Connection(host="192.168.1.188:32769", userid="guest", password="guest", virtual_host="/") chan = con.channel() chan.exchange_declare(exchange='log', type='direct') severity = sys.argv[1] if len(sys.argv) > 1 else 'info' massage = ' '.join(sys.argv[2:]) or 'Hello World!' msg = amqp.Message(massage) chan.basic_publish(msg,exchange='log',routing_key=severity) chan.close() con.close()
文章转载来源于:http://blog.csdn.net/anzhsoft/article/details/19630147

浙公网安备 33010602011771号