使用 NServiceBus 和 RabbitMQ 创建自定义交换名称

问题描述 投票:0回答:1

NSB 8 在 RabbitMQ 中创建交换时使用命名空间:类。像这样:

PMSRecalc.MessageHandling:CompetitorDataIsReady

使用 Camels RabbitMQ 插件从 quarkus 发送消息时会出现问题。

如何使用名称空间-类名之类的内容覆盖默认命名约定

PMSRecalc.MessageHandling-CompetitorDataIsReady

目前在 quarkus,我正在使用这个 hack

#在名称中使用带有冒号“:”的交换是很棘手的,因为组件认为我们使用旧的服务器:端口语法
#使用三个斜杠强制使用旧语法可以解决问题 - 第三个斜杠之后的文本只能解释为交换名称 outnsb:rabbitmq:///TradingService.Messages:NetAssetValueMessageList?exchangeType=fanout&routingKey=nav&skipQueueDeclare=true&autoDelete=false

我听说在新的 spring 版本中,camel 的 RabbitMQ 组件将删除这个 hack。还没尝试过,但我想做好准备。也想摆脱这个警告

旧语法rabbitmq://hostname:port/exchangeName 已弃用..

quarkus nservicebus
1个回答
0
投票

阅读 NSB 文档几个小时后,我发现了这个段落

var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseCustomRoutingTopology(
    topologyFactory: createDurableExchangesAndQueues =>
    {
        return new MyRoutingTopology(createDurableExchangesAndQueues);
    });

我反编译了ConventionalRoutingTopology类并对构造函数做了一些小修改

 public CustomConventionalRoutingTopology(bool durable, QueueType queueType)
    {
        _durable = durable;
        _queueType = queueType;
        _exchangeNameConvention = type => type.Namespace + "_" + type.Name;
    }

并使用我的新自定义类,如下所示:

var transport = epc.UseTransport<RabbitMQTransport>()
        .ConnectionString(config.ConnectionString)
        .UseCustomRoutingTopology(topologyFactory: 
  createDurableExchangesAndQueues =>
            new 
  CustomConventionalRoutingTopology(createDurableExchangesAndQueues, 
  QueueType.Classic));
 

我仍然对不需要自定义代码的解决方案非常感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.