如何在NServiceBus与RabbitMQ中自定义交换机名称?
解决NSB 8 RabbitMQ交换机命名与Quarkus Camel RabbitMQ插件兼容问题
一、从根源解决:修改NSB 8的交换机命名规则
NSB 8默认用namespace:class格式生成RabbitMQ交换机名称,我们可以通过自定义消息转换器替换这一规则,改为namespace-classname格式:
- 实现
IMessageToExchangeNameConverter接口,重写命名逻辑:
using NServiceBus; using NServiceBus.Routing; public class CustomExchangeNameConverter : IMessageToExchangeNameConverter { public string Convert(Type messageType, string? discriminator = null) { // 将消息类型全限定名中的冒号替换为横杠 return messageType.FullName!.Replace(':', '-'); } }
- 在NSB端点配置中注册该转换器:
var endpointConfig = new EndpointConfiguration("YourEndpointName"); var rabbitTransport = endpointConfig.UseTransport<RabbitMQTransport>(); rabbitTransport.MessageToExchangeNameConverter(new CustomExchangeNameConverter());
配置完成后,NSB创建的交换机名称会自动变为PMSRecalc.MessageHandling-CompetitorDataIsReady,彻底消除冒号带来的兼容问题。
二、调整Quarkus Camel RabbitMQ配置,消除弃用警告
旧版的rabbitmq:///ExchangeName三斜杠语法已被弃用,新版Camel推荐通过exchangeName参数指定交换机,无论交换机名称是否带冒号都适用:
场景1:已修改NSB命名规则(无冒号)
outnsb: rabbitmq://localhost:5672?exchangeName=TradingService.Messages-NetAssetValueMessageList&exchangeType=fanout&routingKey=nav&skipQueueDeclare=true&autoDelete=false
场景2:暂未修改NSB命名规则(带冒号)
直接通过exchangeName参数传入带冒号的名称即可,无需依赖旧语法:
outnsb: rabbitmq://localhost:5672?exchangeName=TradingService.Messages:NetAssetValueMessageList&exchangeType=fanout&routingKey=nav&skipQueueDeclare=true&autoDelete=false
这种写法完全符合新版Camel组件的规范,不会触发弃用警告,同时能正常发送消息到目标交换机。
内容的提问来源于stack exchange,提问作者Martin Andersen
相关产品推荐
相关产品推荐

