RabbitMQ AMQP 1.0下用AMQPNetLite操作Topic Exchange无法路由消息
问题根因
你遇到的问题由两个配置遗漏导致:
- RabbitMQ 的 AMQP 1.0 插件默认不会将消息的
Subject属性直接映射为Topic Exchange的路由键,需要显式指定路由键配置 - 你创建SenderLink时使用的地址格式不符合RabbitMQ AMQP 1.0的规范,无法正确匹配自定义的Topic Exchange
解决方案
1. 修正SenderLink的地址格式
RabbitMQ AMQP 1.0 插件的地址规则如下:
- 发往自定义Exchange的统一前缀为
/exchange/[Exchange名称] /topic/前缀仅适用于内置的amq.topicExchange,不适用于自定义创建的Topic Exchange
2. 显式指定消息路由键
你需要在消息的MessageAnnotations属性中添加x-opt-routing-key字段,值为你要使用的路由键,RabbitMQ会优先读取该字段作为路由依据。你也可以通过修改RabbitMQ配置开启subject到路由键的映射,但显式指定x-opt-routing-key兼容性更强,不需要修改服务端配置。
修正后的代码
var rabbitMqAddress = $"amqp://127.0.0.1:5672"; var address = new Address(rabbitMqAddress); var producerName = $"Producer-test.topic-{Time.GetTimeStamp()}"; var connection = new Connection(address, null, new Open { ContainerId = Guid.NewGuid().ToString(), ChannelMax = 64, }, null); var session = new Session(connection); // 修正地址格式,使用/exchange前缀匹配自定义Exchange var senderLink = new SenderLink(session, producerName, "/exchange/test.exchange"); senderLink.Send(new Message { BodySection = new AmqpValue { Value = "test 123" }, Properties = new Properties { Subject = "test", }, // 新增MessageAnnotations配置,显式指定路由键 MessageAnnotations = new MessageAnnotations( new Dictionary<object, object> { { "x-opt-routing-key", "test" } }) });
验证步骤
修改代码后可以先做以下校验:
- 登录RabbitMQ管理后台,进入
test.exchange的详情页,使用"Publish message"功能,routing key填test发送测试消息,确认队列能收到消息,排除服务端绑定配置问题 - 发送代码测试消息后,查看Exchange的"Stats" tab中的
Message routed计数是否增长,确认路由逻辑生效
内容的提问来源于stack exchange,提问作者Paul Carlton
相关产品推荐
相关产品推荐

