RabbitMQ上手記錄–part 3-發送消息

  接上一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

運行以後在第一個命令行就能看到消息輸出

image

 

以上就是最基本的發佈消息和訂閱消息的過程,後續咱們來看看如何實現RabbitMQ集羣。

相關文章
相關標籤/搜索