Quarkus - SmallRye 反应式消息传递 - RabbitMQ:将消息发送到默认交换

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

使用远程过程调用模式,我需要将答案发送到回复队列,即我需要将消息发送到默认交换机,并以队列名称作为路由键。

我在 Quarkus 上使用 SmallRye Reactive Messing RabbitMQ 插件。所有通道都是在配置文件中静态定义的(这是可以的),但是,由于配置机制的工作方式(microprofile config),我无法使用空字符串作为配置值,这是默认交换的名称。

省略交易所的名称没有帮助,因为默认情况下使用通道名称。

有没有办法使用 SmallRye RabbitMQ 插件向默认交换器发送消息?

编辑:我无法控制 RabbitMQ 服务器。

rabbitmq quarkus smallrye-reactive-messaging
1个回答
0
投票

您应该能够通过设置以下属性将消息发送到default直接RabbitMQ交换:

  • exchange.name(设置为空字符串)
  • exchange.type(设置为直接)

假设您的 Reactive Messaging 通道名为 pets-out,这里有一个配置示例:

mp.messaging.outgoing.pets-out.connector=smallrye-rabbitmq
mp.messaging.outgoing.pets-out.exchange.name=
mp.messaging.outgoing.pets-out.exchange.declare=false
mp.messaging.outgoing.pets-out.exchange.type=direct
mp.messaging.outgoing.pets-out.default-routing-key=pets

编辑

深入研究smallrye-reactive-messaging实现后,我发现空的交换名称将导致回退到通道名称作为交换名称。

因此,应该无法将直接消息发送到默认 RabbitMQ 交换

另一种解决方案,忽略提供的开箱即用的默认交换将是

  1. 创建一个direct交换没有任何绑定队列,并使用绑定到它的专用

    channel
    配置来拥有Outgoing消息处理程序:

     mp.messaging.outgoing.pets-out.connector=smallrye-rabbitmq
     mp.messaging.outgoing.pets-out.exchange.name=my-direct
     mp.messaging.outgoing.pets-out.exchange.declare=true
     mp.messaging.outgoing.pets-out.exchange.type=direct
     mp.messaging.outgoing.pets-out.default-routing-key=pets
    
  2. my-direct交换路由消息创建备用交换配置到默认交换路由消息。这可以直接使用 rabbitmqctl

    RabbitMQ
    代理上操作:

     rabbitmqctl set_policy AE "^my-direct$" '{"alternate-exchange":""}' --apply-to exchanges
    
© www.soinside.com 2019 - 2024. All rights reserved.