Python rabbitmq的使用(五)

上一篇說了路由鍵的功能,經過設置路由鍵,能夠將消息發送到相應的隊列,這裏的路由鍵是要徹底匹配,好比info消息的只能發到路由鍵爲info的消息隊列。html

路由鍵模糊匹配,就是可使用正則表達式,和經常使用的正則表示式不一樣,這裏的話「#」表示全部、所有的意思;「*」只匹配到一個詞。看完示例就能明白了。python

這邊繼上一篇,仍是用send.py和receive.py來實現路由鍵模糊匹配的功能。send.py表示發送端,receive.py表示接收端。實例的功能大概是這樣:好比你有個知心好朋友,無論開心、傷心、工做上的仍是生活上的事情均可以和她說;還有一些朋友能夠分享開心的事情;還有一些朋友,你能夠把不開心的事情和她說。正則表達式

send.py代碼分析app

由於要進行路由鍵模糊匹配,因此交換機的類型要設置爲topic,設置爲topic,就可使用#,*的匹配符號了。測試

1spa

2命令行

3code

4htm

5rabbitmq

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()

 

#定義交換機,設置類型爲topic

channel.exchange_declare(exchange='messages'type='topic')

 

#定義路由鍵

routings = ['happy.work''happy.life''sad.work''sad.life']

 

#將消息依次發送到交換機,並設定路由鍵

for routing in routings:

    message = '%s message.' % routing

    channel.basic_publish(exchange='messages',

                          routing_key=routing,

                          body=message)

    print message

 

connection.close()

上例中定義了四種類型的消息,容易理解,就不解釋了,而後依次發送出去。

receive.py代碼分析

一樣,交換機的類型要設定爲topic就能夠了。從命令行接收參數的功能稍微調整了一下,就是沒有參數時報錯退出。

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

32

#!/usr/bin/env python

#coding=utf8

import pika, sys

 

connection = pika.BlockingConnection(pika.ConnectionParameters(

               'localhost'))

channel = connection.channel()

 

#定義交換機,設置類型爲topic

channel.exchange_declare(exchange='messages'type='topic')

 

#從命令行獲取路由參數,若是沒有,則報錯退出

routings = sys.argv[1:]

if not routings:

    print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)

    exit()

 

#生成臨時隊列,並綁定到交換機上,設置路由鍵

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 "#"

另一個終端 運行以下,表示能夠和她分享開心的事:

python receive.py "happy.*"

第三個運行以下,表示工做上的事情能夠和她分享:

python receive.py "*.work"

最後一個運行python send.py。結果不難想象出來,就不貼出來了。

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

在參考文章的最後面有提到幾個難點,筆者本身作了測試,供你們參考:

一、發送信息時,若是不設置路由鍵,那麼路由鍵設置爲」*」的接收端是否能接收到消息?

發送信息時,若是不設置路由鍵,默認是表示廣播出去,理論上全部接收端均可以收到消息,可是筆者試了下,路由鍵設置爲"*"的接收端收不到任何消息。

只有發送消息時,設置路由鍵爲一個詞,路由鍵設置爲"*"的接收端才能收到消息。在這裏,每一個詞使用"."符號分開的。

二、發送消息時,若是路由鍵設置爲」..」,那麼路由鍵設置爲」#.*」的接收端是否能接收到消息?若是發送消息時,路由鍵設置爲一個詞呢?

兩種狀況,筆者都測試過了,能夠的。

三、」a.*.#」 和」a.#」的區別

"a.#"只要字符串開頭的一個詞是a就能夠了,好比a、a.haha、a.haha.haha。而這樣的詞是不行的,如abs、abc、abc.haha。

"a.*.#"必需要知足a.*的字符串才能夠,好比a.、a.haha、a.haha.haha。而這樣的詞是不行的,如a。

弄完上面的這些個問題,筆者覺着有些鑽牛角尖了,不過既然官方有提出來,就鑽一回吧。

相關文章
相關標籤/搜索