Rebus.RabbitMQ指定交换器名称无效,始终使用RebusTopics如何解决?
问题分析与解决方案
你碰到的问题其实是Rebus中不同类型交换器的配置逻辑搞混了——你配置的是直接交换器(Direct Exchange)的名称,但使用Topics.Publish进行主题发布时,Rebus会使用主题交换器(Topic Exchange),而它的默认名称就是RebusTopics,所以才会出现不管怎么配置直接交换器,消息都跑到默认主题交换器的情况。
具体原因
Rebus的RabbitMQ传输中,ExchangeNames方法里的directExchangeName参数是给**点对点消息(Send操作)用的直接交换器命名;而发布订阅(Publish操作)**依赖的是主题交换器,需要通过topicExchangeName参数来指定。你的代码只配置了直接交换器,主题交换器还是用的默认值。
修正后的配置代码
把你的配置改成这样,就能让主题发布的消息发到你指定的RebusBus交换器了:
using (var publisher = new BuiltinHandlerActivator()) { var publishBus = Configure.With(publisher) .Transport(y => y.UseRabbitMq(rabbitUrl, "_Rebus") .ExchangeNames( directExchangeName: "RebusBus", // 可选,如果你需要给点对点消息用这个交换器 topicExchangeName: "RebusBus" // 重点:指定主题发布用的交换器名称 )) .Start(); publishBus.Advanced.Topics.Publish("Debug", new DebugMessage()).Wait(); }
额外说明
- 如果你的场景只需要发布订阅,其实可以不用配置
directExchangeName,只指定topicExchangeName就行。 - Rebus会自动创建对应的交换器(如果不存在的话),所以不需要提前在RabbitMQ管理后台手动创建。
内容的提问来源于stack exchange,提问作者gmn
相关产品推荐
相关产品推荐

