如何在spring cloud stream rabbitmq中使用rabbitmq的当前交换和队列名称

DKW*_*Woo 1 cloud spring stream spring-rabbit

我正在将传统的 Spring 应用程序切换到 Spring Boot。

使用 spring cloud stream rabbitmq 迁移 rabbitmq 代码存在问题。

在遗留系统中,rabbitmq 队列是通过提供交换、路由密钥和队列名称来设置的。

例如,

exchange name = mq-test.topic
routingKey = mq-test
queueName = aa.mq-test
Run Code Online (Sandbox Code Playgroud)

所以在rabbitmq 管理视图中我可以看到exchange 是mq-test.topic,queue 是aa.mq-test。

但是对于 Spring Cloud 流,队列名称点缀着目的地,例如

mq-test.topic.aa.mq-test

我的 spring 云流属性是这样的。

spring.cloud.stream.bindings.channelName.destination=mq-test.topic
spring.cloud.stream.bindings.channelName.producer.bindingRoutingKey=mq-test
spring.cloud.stream.bindings.channelName.producer.requiredGroups=aa.mq-test
Run Code Online (Sandbox Code Playgroud)

我还代表 bindingRoutingKey 使用了 routingKeyExpression 属性,但结果是一样的。

有遗留应用程序通过队列名称使用数据,而我的新应用程序仅生成数据,因此我无法更改交换和队列名称策略。

如何使用 Spring Cloud 流保持交换/队列命名?

任何帮助表示赞赏。

Gar*_*ell 6

请参阅 RabbitMQ Binder 文档Using Existing Queues/Exchanges

默认情况下,活页夹将自动提供主题交换,其名称源自目标绑定属性的值。如果未提供,目标默认为绑定名称。绑定消费者时,队列将自动提供名称。(如果指定了组绑定属性),或者没有组时的匿名自动删除队列。对于非分区绑定或 - 对于分区绑定,队列将使用“全部匹配”通配符路由键 (#) 绑定到交换。前缀默认为空字符串。如果使用 requiredGroups 指定了输出绑定,则将为每个组提供一个队列/绑定。

有许多特定于兔子的绑定属性允许您修改此默认行为。

如果您有想要使用的现有交换/队列,则可以按如下方式完全禁用自动配置,假设交换名为 myExchange 且队列名为 myQueue:

spring.cloud.stream.binding.<binding name>.destination=myExhange

spring.cloud.stream.binding.<binding name>.group=myQueue

spring.cloud.stream.rabbit.bindings.<binding name>.consumer.bindQueue=false

spring.cloud.stream.rabbit.bindings.<binding name>.consumer.declareExchange=false

spring.cloud.stream.rabbit.bindings.<binding name>.consumer.queueNameGroupOnly=true

...