第三篇說明了關於交換機的使用,已經能實現給所有接收端發送訊息,但是如果需要自由定制,有的消息發給其中一些接收端,有些消息發送給另外一些接收端,該怎麼辦呢?這種情況下就要用到路由鍵了。
路由鍵的工作原理:每個接收端的訊息佇列在綁定交換器的時候,可以設定對應的路由鍵。當傳送端透過交換器傳送訊息時,可以指明路由鍵 ,交換機會根據路由鍵把訊息傳送到對應的訊息佇列,這樣接收端就能接收到訊息了。
這邊繼上一篇,還是用send.py和receive.py來模擬實現路由鍵的功能。 send.py表示發送端,receive.py表示接收端。實例的功能就是將info、warning、error三種層級的資訊傳送到不同的接收端。
send.py代碼分析
和上一篇相比,改動點主要在兩個方面:
設定交換器的類型(type)為direct。上一篇是設定為fanout,表示廣播的意思,會將訊息傳送到所有接收端,這裡設定為direct表示要根據設定的路由鍵來傳送訊息。
發送訊息時設定發送的路由鍵。
#!/usr/bin/env python #coding=utf8 import pika connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机,设置类型为direct channel.exchange_declare(exchange='messages',type='direct') #定义三个路由键 routings= ['info','warning','error'] #将消息依次发送到交换机,并设置路由键 for routingin routings: message= '%s message.' % routing channel.basic_publish(exchange='messages', routing_key=routing, body=message) print message connection.close()
receive.py程式碼分析
和第三篇相比,改動點主要在三個方面:
設定交換器的類型(type)為direct。
增加命令列取得參數功能,參數即為路由鍵。
將佇列綁定到交換器上時,設定路由鍵。
#!/usr/bin/env python #coding=utf8 import pika, sys connection= pika.BlockingConnection(pika.ConnectionParameters( 'localhost')) channel= connection.channel() #定义交换机,设置类型为direct channel.exchange_declare(exchange='messages',type='direct') #从命令行获取路由键参数,如果没有,则设置为info routings= sys.argv[1:] if not routings: routings= ['info'] #生成临时队列,并绑定到交换机上,设置路由键 result= channel.queue_declare(exclusive=True) queue_name= result.method.queue for routingin routings: channel.queue_bind(exchange='messages', queue=queue_name, routing_key=routing) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) channel.basic_consume(callback, queue=queue_name, no_ack=True) print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
開啟兩個終端,一個執行程式碼python receive.py info warning,表示只接收info和warning的訊息。另外一個終端運行send.py,可以觀察到接收終端只接收到了info和warning的訊息。如果開啟多個終端運行receive.py,並傳入不同的路由鍵參數,可以看到更明顯的效果。
當接收端正在運作時,可以使用rabbitmqctl list_bindings來查看綁定情況。
以上就是Python rabbitmq的使用(四)的內容,更多相關內容請關注PHP中文網(www.php.cn)!