如何让Rabbit MQ队列在存储和转发模式下运行?

时间:2014-08-17 02:21:05

标签: python rabbitmq amqp pika

我正在使用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()

1 个答案:

答案 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