Python rabbitmq的使用(四)

第三篇說明了關於交換機的使用,已經能實現給全部接收端發送消息,可是若是須要自由定製,有的消息發給其中一些接收端,有些消息發送給另一些接收端,要怎麼辦呢?這種狀況下就要用到路由鍵了。html

路由鍵的工做原理:每一個接收端的消息隊列在綁定交換機的時候,能夠設定相應的路由鍵。發送端經過交換機發送信息時,能夠指明路由鍵 ,交換機會根據路由鍵把消息發送到相應的消息隊列,這樣接收端就能接收到消息了。python

這邊繼上一篇,仍是用send.py和receive.py來模擬實現路由鍵的功能。send.py表示發送端,receive.py表示接收端。實例的功能就是將info、warning、error三種級別的信息發送到不一樣的接收端。spa

send.py代碼分析命令行

和上一篇相比,改動點主要在兩個方面:code

  • 設定交換機的類型(type)爲direct。上一篇是設置爲fanout,表示廣播的意思,會將消息發送到全部接收端,這裏設置爲direct表示要根據設定的路由鍵來發送消息。
  • 發送信息時設置發送的路由鍵。

1htm

2rabbitmq

3隊列

4ci

5路由

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#!/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 routing in routings:

    message = '%s message.' % routing

    channel.basic_publish(exchange='messages',

                          routing_key=routing,

                          body=message)

    print message

 

connection.close()

receive.py代碼分析

和第三篇相比,改動點主要在三個方面:

  • 設定交換機的類型(type)爲direct。
  • 增長命令行獲取參數功能,參數即爲路由鍵。
  • 將隊列綁定到交換機上時,設定路由鍵。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#!/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 routing in 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來查看綁定狀況。

參考文章:http://www.rabbitmq.com/tutorials/tutorial-four-python.html

相關文章
相關標籤/搜索