python-komburegister_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
版权声明
本文仅代表作者观点,不代表博信信息网立场。