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

posted @ 2016-06-06 17:04  rcj_飞翔  阅读(1081)  评论(0)    收藏  举报