接上一part<<RabbitMQ上手記錄–part 2 - 安裝RabbitMQ>>,這裏咱們來看看如何經過代碼實現對RabbitMQ的調用。html
RabbitMQ一般是安裝在服務器端,那麼要體現它的功能,固然還須要一個客戶端來調用。這個客戶端一般就是咱們的業務系統,那麼如何操做RabbitMQ呢?不可能讓程序員寫底層的傳輸代碼或者侷限於用erlang開發語言。RabbitMQ已經貼心的準備好了API Client,沒錯就是程序員喜聞樂見的API(或者說是調包)。python
RabbitMQ官方(http://www.rabbitmq.com/clients.html)提供了Java,.NET和erlang的API包,Java和.NET是開發業務系統的兩大陣型,erlang是RabbitMQ的開發語言,因此官方主推了這三個語言的API包。那其餘語言呢?沒問題,RabbitMQ雖然沒有提供實現,可是給出了」amqp」的URI規範(http://www.rabbitmq.com/uri-spec.html),也就是跟服務器通信的一套協議,其餘開發語言照着這個規範實現就能夠了。有了官方的指引文檔,加上活躍熱心的社區羣衆,其餘語言也有各自的API包,具體可參考http://www.rabbitmq.com/devtools.html。程序員
這裏採用很火的Python做爲示例代碼,演示消費者如何訂閱消息,生產者如何發佈消息。數據庫
準備工做bash
1.已安裝好RabbitMQ,並確保服務是在運行的()。服務器
2.有可用的Python環境,並安裝了RabbitMQ的API包pika。函數
開始編碼ui
a.新建文件rabbitMQConfig.py,代碼以下編碼
import pika, sys def getDefaultChannel(): credentials = pika.PlainCredentials("guest", "guest") conn_params = pika.ConnectionParameters( "localhost", credentials=credentials) conn_broker = pika.BlockingConnection(conn_params) channel = conn_broker.channel() return channel
各行代碼大體的意思spa
credentials = pika.PlainCredentials("guest", "guest")
guest是RabbitMQ默認的一個訪客帳號,只能用於鏈接本機localhost服務,密碼默認也是guest。這裏是建立明文的訪問帳號信息。
conn_params = pika.ConnectionParameters("localhost", credentials=credentials)
建立鏈接參數,有點相似於數據庫的鏈接字符串信息
conn_broker = pika.BlockingConnection(conn_params)
channel = conn_broker.channel()
這裏是建立一個鏈接,而且是一個阻塞的鏈接,會一直阻塞直到收到服務器的響應。而後建立一個通信的channel,這個channel是進行後續操做的關鍵接口。
b.新建文件HelloWorldConsumer.py,代碼以下
import rabbitMQConfig import pika channel = rabbitMQConfig.getDefaultChannel() channel.exchange_declare( exchange="hello-exchange", exchange_type="direct", passive=False, durable=True, auto_delete=False) channel.queue_declare(queue="hello-queue") channel.queue_bind( queue="hello-queue", exchange="hello-exchange", routing_key="hola") def msg_consumer(channel, method, header, body): channel.basic_ack(delivery_tag=method.delivery_tag) if body == "quit": channel.basic_cancel(consumer_tag="hello-consumer") channel.stop_consuming() else: print body return channel.basic_consume( msg_consumer, queue="hello-queue", consumer_tag="hello-consumer") channel.start_consuming()
代碼解釋
在以前建立channel代碼的基礎上,咱們依次完成了如下動做
channel.exchange_declare(
exchange="hello-exchange",
exchange_type="direct",
passive=False,
durable=True,
auto_delete=False)
建立exchange,名稱爲」hello-exchange」,類型是」direct」,也就是這個exchange是嚴格按照routing_key的值來匹配消息隊列的。(具體相關的基本概念請參考《RabbitMQ 上手記錄-part 1-基礎概念》)
channel.queue_declare(queue="hello-queue")
channel.queue_bind(
queue="hello-queue", exchange="hello-exchange", routing_key="hola")
建立queue,名稱爲」hello-queue「,而且綁定到」hello-exchange」,關聯的routing_key是」hola」。這裏的queue就是用於存放消息的消息隊列。
def msg_consumer(channel, method, header, body):
這裏定義了收到消息後的回調函數,這個函數會回確認消息已收到,同時會打印出收到的消息或者根據消息內容關閉鏈接。
channel.basic_consume(
msg_consumer, queue="hello-queue", consumer_tag="hello-consumer")
channel.start_consuming()
最後的就是開始消費這個隊列的消息,這是一個阻塞的操做,會一直等待有消息進入隊列並推送到客戶端。
到此消費者端的代碼就完成了,接下來看看生產者端的代碼。
c.新建文件HelloWorldProducer.py
import sys import pika import rabbitMQConfig channel = rabbitMQConfig.getDefaultChannel() channel.exchange_declare( exchange="hello-exchange", exchange_type="direct", passive=False, durable=True, auto_delete=False) msg = sys.argv[1] msg_props = pika.BasicProperties() msg_props.content_type = "text/plain" channel.basic_publish( body=msg, exchange="hello-exchange", properties=msg_props, routing_key="hola")
這裏的代碼前面幾行跟消費者的調用代碼相似,都是經過配置拿到channel信息,而後聲明一個exchange。可能比較奇怪,爲何以前消費者的代碼裏也調用了一樣的代碼聲明一樣的exchange。在聲明exchange的時候,系統會判斷是否已存在了相同名稱的exchange,若是存在了直接返回。
msg = sys.argv[1]
msg_props = pika.BasicProperties()
msg_props.content_type = "text/plain"
這裏定義了須要發送的消息內容,發送的文本從命令行獲取,而且設置消息的content_type爲」text/plain」
channel.basic_publish(
body=msg,
exchange="hello-exchange",
properties=msg_props,
routing_key="hola")
接下來是發佈消息,關鍵的參數是指定發佈到哪一個exchange,消息內容,以及routing_key。
運行
python HelloWorldConsumer.py
而後另起一個bash/命令行
python HelloWorldProducer.py hello
運行以後在第一個命令行就能看到消息輸出
以上就是最基本的發佈消息和訂閱消息的過程,後續咱們來看看如何實現RabbitMQ集羣。