kombu register_callback 和 on_message 的区别?

register_callback 添加的 func 接受两个参数

from kombu.transport.pyamqp import Message

def callback(body, message: Message):
    logger.debug(type(body))
    logger.debug(message)
    logger.debug(message.body)
    message.ack()

register_callback 添加的 func 接受一个参数

from kombu.transport.pyamqp import Message

def callback(message: Message):
    logger.debug(type(body))
    logger.debug(message)
    logger.debug(message.body)
    message.ack()

相关的代码可见:

kombu/messaging.py

def _receive_callback(self, message):
    accept = self.accept
    on_m, channel, decoded = self.on_message, self.channel, None
    try:
        m2p = getattr(channel, 'message_to_python', None)
        if m2p:
            message = m2p(message)
        if accept is not None:
            message.accept = accept
        if message.errors:
            return message._reraise_error(self.on_decode_error)
        decoded = None if on_m else message.decode()
    except Exception as exc:
        if not self.on_decode_error:
            raise
        self.on_decode_error(message, exc)
    else:
        return on_m(message) if on_m else self.receive(decoded, message)

从上面可以看出,如果你需要 kombu 帮你做 decode,那可以选择 register_callback;

但是让 kombu 做 decode 有一个坏处,就是 decode 失败了,没有办法把 message 做 requeue 处理。你只能选择『先关闭连接、然后重新连接』

这个时候,我更愿意使用 on_message 自己处理 decode

你可能感兴趣的:(kombu register_callback 和 on_message 的区别?)