You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NServiceBus与RabbitMQ中自定义交换机名称?

解决NSB 8 RabbitMQ交换机命名与Quarkus Camel RabbitMQ插件兼容问题

一、从根源解决:修改NSB 8的交换机命名规则

NSB 8默认用namespace:class格式生成RabbitMQ交换机名称,我们可以通过自定义消息转换器替换这一规则,改为namespace-classname格式:

  1. 实现IMessageToExchangeNameConverter接口,重写命名逻辑:
using NServiceBus;
using NServiceBus.Routing;

public class CustomExchangeNameConverter : IMessageToExchangeNameConverter
{
    public string Convert(Type messageType, string? discriminator = null)
    {
        // 将消息类型全限定名中的冒号替换为横杠
        return messageType.FullName!.Replace(':', '-');
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:33:23