本文將使用Python(pika 0.9.8)實現從Producer到Consumer傳遞資料”Hello, World“。
首先複習一下上篇所學:RabbitMQ實現了AMQP定義的訊息佇列。它實現的功能”非常簡單“:從Producer接收資料然後傳遞到Consumer。它能保證多併發,資料安全傳遞,可擴充套件。
和任何的Hello world一樣,它們都不復雜。我們將會設計兩個程式,一個傳送Hello world,另一個接收這個資料並且列印到螢幕。
整體的設計如下圖:
1. 環境配置
RabbitMQ 實現了AMQP。因此,我們需要安裝AMPQ的library。幸運的是對於多種程式語言都有實現。我們可以使用以下lib的任何一個:
在這裡我們將使用pika. 可以通過
pip 包管理工具來安裝:$ sudo pip install pika==0.9.8複製程式碼
這個安裝依賴於pip和git-core。
- On Ubuntu:
$ sudo apt-get install python-pip git-core 複製程式碼
- On Debian:
$ sudo apt-get install python-setuptools git-core $ sudo easy_install pip 複製程式碼
- On Windows:To install easy_install, run the MS Windows Installer for
setuptools> easy_install pip > pip install pika==0.9.8 複製程式碼
2. Sending
第一個program send.py:傳送Hello world 到queue。正如我們在上篇文章提到的,你程式的第一句話就是建立連線,第二句話就是建立channel:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()複製程式碼
建立連線傳入的引數就是RabbitMQ Server的ip或者name。
關於誰建立queue,上篇文章也討論過:Producer和Consumer都應該去建立。
接下來我們建立名字為hello的queue:
channel.queue_declare(queue='hello')複製程式碼
建立了channel,我們可以通過相應的命令來list queue:
$ sudo rabbitmqctl list_queues
Listing queues ...
hello 0
...done.複製程式碼
現在我們已經準備好了傳送了。
從架構圖可以看出,Producer只能傳送到exchange,它是不能直接傳送到queue的。現在我們使用預設的exchange(名字是空字元)。這個預設的exchange允許我們傳送給指定的queue。routing_key就是指定的queue名字。
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
複製程式碼
退出前別忘了關閉connection。
connection.close()複製程式碼
3. Receiving
第二個program receive.py 將從queue中獲取Message並且列印到螢幕。
第一步還是建立connection。第二步建立channel。第三步建立queue,name = hello:
channel.queue_declare(queue='hello')複製程式碼
接下來要subscribe了。在這之前,需要宣告一個回撥函式來處理接收到的資料。
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)複製程式碼
subscribe:
channel.basic_consume(callback,
queue='hello',
no_ack=True)複製程式碼
最後,準備好無限迴圈監聽吧:
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()複製程式碼
4. 最終版本
send.py:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()複製程式碼
receive.py:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
print ' [*] Waiting for messages. To exit press CTRL+C'
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
channel.basic_consume(callback,
queue='hello',
no_ack=True)
channel.start_consuming()複製程式碼
5. 最終執行
先執行 send.py program:
$ python send.py
[x] Sent 'Hello World!'複製程式碼
send.py 每次執行完都會停止。注意:現在資料已經存到queue裡了。接收它:
$ python receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'複製程式碼
接下來,就要奉上更接近實際環境的例子。取決與我的課餘時間啊。。。
參考文獻:
1. http://www.rabbitmq.com/tutorials/tutorial-one-python.html