Python RabbitMQ消息持久化

RabbitMQ消息持久化:就是將隊列中的消息永久的存放在隊列中。
 
處理方案:
# 在實例化時加入durable=True來確認消息的實例化,客戶端服務端都要寫
channel.queue_declare(queue='hello1',durable=True)
注:只持久化了隊列,並無持久化消息。
 
# 消息持久話,在channel.basic_publish加入參數
properties = pika.BasicProperties(delivery_mode = 2,)
注:pika.BasicProperties下能夠自定以參數,delivery_mode = 2是默認的。
 
 
send端 發送消息後重啓rabbitmq服務
#!/usr/bin/env python
import pika

# 經過實例建立socket
connection = pika.BlockingConnection(
        pika.ConnectionParameters('localhost')
        )

# 聲明一個管道/在管道內發消息
channel = connection.channel()

# 管道內,聲明一個隊列,queue=queue的名字
# durable=True持久話隊列
channel.queue_declare(queue='hello10',durable=True)

# routing_key = queue的名字
# body = 消息內容
# properties = pika.BasicProperties 持久話參數,可在()加入定義參數
# delivery_mode =2  持久化消息
# 一個消息不能直接發送到隊列,它老是須要通過一個exchange。
channel.basic_publish(exchange='',
                      routing_key='hello10',
                      body='Hello World!',
                      properties = pika.BasicProperties(
                      delivery_mode = 2,)
                      )
print(" [x] Sent 'Hello World!'")

# 關閉隊列
connection.close()

 

recv端
#_*_coding:utf-8_*_
__author__ = 'Alex Li'
import pika,time

# 實例話建立socket
connection = pika.BlockingConnection(
        pika.ConnectionParameters('localhost'))

# 聲明一個管道/在管道內發消息
channel = connection.channel()

# 爲何再次聲明queue名字:若是消費者先運行了,沒有聲明queue就會報錯
# 若是想要防止報錯發生,就要定義queue。
#
# 管道內,聲明一個隊列,queue=queue的名字
# durable=True持久話隊列
channel.queue_declare(queue='hello10',durable=True)

#回調函數
# ch 管道內存對象地址
# method 消息發給哪一個queue
# body = 消息內容
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    #time.sleep(10)
    # 消息處理完後會向生產端發送確認指令
    ch.basic_ack(delivery_tag=method.delivery_tag)

# 消費消息
# callback 若是收到消息,就調用callback函數來處理消息
# queue 管道內的隊列名字
# no_ack = True 這條消息出沒處理完都不會給服務端發確認
channel.basic_consume(
                    callback,
                    queue='hello10',)

print(' [*] Waiting for messages. To exit press CTRL+C')

# 啓動後一直運行,沒有數據會等待..
channel.start_consuming()
相關文章
相關標籤/搜索