【问题标题】:How to have a Rabbit MQ queue operate in store and forward mode?如何让 Rabbitmq 队列在存储和转发模式下运行?
【发布时间】:2014-08-17 02:21:04
【问题描述】:

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

【问题讨论】:

    标签: python rabbitmq amqp pika


    【解决方案1】:

    您需要将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
    

    【讨论】:

    • 感谢您的回复,我尝试实施您的建议,但交付仍然是 True,即使我的 rabbitmq 服务器已关闭。
    猜你喜欢
    • 2014-05-19
    • 2023-02-09
    • 2013-04-28
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多