我正在使用Python Pika客户端试验Rabbit MQ。我想做的是让我的AMQP发送器以存储和转发模式运行,即如果服务器或网络关闭则能够开始排队消息,并在以后可靠地提供它们。我怎么做?我的amqp-sender.py代码如下:
import pika
import psutil
import time
import datetime
import log
import json
import logging
import uuid
from dateutil.tz import tzlocal
logging.basicConfig()
logger = log.setup_custom_logger('amqp_send', 'amqp_send.log')
connection = pika.BlockingConnection(pika.ConnectionParameters(host='54.191.161.213'))
channel = connection.channel()
channel.confirm_delivery()
channel.queue_declare(queue='ems.data')
def get_mac_address():
return ':'.join(['{:02x}'.format((uuid.getnode() >> i) & 0xff) for i in range(0,8*6,8)][::-1])
while True:
now = datetime.datetime.now(tzlocal())
timestamp = now.strftime('%Y-%m-%d %H:%M:%S.%f %z')
data = {
'timestamp':timestamp,
'systemId':get_mac_address(),
'cpuPct':psutil.cpu_percent(),
'memoryUsed':psutil.virtual_memory().used
}
msg=json.dumps(data)
delivered=channel.basic_publish(exchange='', routing_key='abc', body=msg, mandatory=True)
if delivered:
logger.info("delivered %s" % msg)
else:
logger.error('failed to deliver %s' % msg)
time.sleep(1)
connection.close()
答案 0 :(得分:2)
您需要将channel.confirm_delivery()
与mandatory=True
confirm_delivery
将返回布尔值,具体取决于Rabbit是否正确处理了消息。
mandatory
标志:
此标志告诉服务器如果无法路由消息,如何做出反应 到队列。具体来说,如果设置了强制,并且在运行之后 绑定消息放在零队列然后消息是 返回发件人(使用basic.return)。如果强制要求没有 在相同的情况下设置服务器将默默地丢弃 消息。
所以你会有这样的事情:
channel.confirm_delivery()
delivered = channel.basic_publish(exchange='', routing_key='ems.data', body=msg, mandatory=True)
if not delivered:
# store message for later reprocessing