如何正确使用proton-python接收qpidd指定topic的消息
问题排查
你的代码存在两处核心错误:
- 错误使用
dynamic=True参数:该参数用于让broker自动生成临时唯一队列,使用时不需要手动指定目标地址。你同时传入了自定义topic地址和dynamic=True,导致参数冲突,无法正确绑定到amq.topic交换器的指定路由键。 - 地址规则适配:如果需要接收
com.product.sample1、com.product.sample2这类符合规则的消息,需要用topic通配符匹配,单级路径匹配用*,多级路径匹配用#。
修正后代码
from proton.handlers import MessagingHandler from proton.reactor import Container broker_url = "192.168.80.81:5672" # 匹配所有com.product.sample开头的单级路由键,适配sample1、sample2的场景 topic = "amq.topic/com.product.sample*" # 如果只需要接收sample1的消息,直接写 topic = "amq.topic/com.product.sample1" 即可 class Client(MessagingHandler): def __init__(self, broker_url, topic): super(Client, self).__init__() self.broker_url = broker_url self.topic = topic def on_start(self, event): conn = event.container.connect(self.broker_url) # 移除dynamic=True参数,直接指定接收地址 self.receiver = event.container.create_receiver(conn, self.topic) def on_message(self, event): print(event.message.body) Container(Client(broker_url, topic)).run()
补充说明
命令行的qpid-receive默认走AMQP 0-10协议,和python-qpid-proton默认使用的AMQP 1.0协议在qpidd上的地址规则基本兼容,你遇到的问题核心就是dynamic=True参数导致的绑定失败,移除后即可实现和命令行一致的接收效果。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

