我正在将旧版Spring应用程序切换为Spring Boot。
使用Spring Cloud Stream Rabbitmq迁移Rabbitmq代码存在问题。
在旧系统中,rabbitmq队列是通过提供交换,routingKey和队列名称来设置的。
例如
stringRequest.setShouldCache(false);
因此,在rabbitmq管理视图中,我可以看到 交换是mq-test.topic,队列是aa.mq-test。
但是在春季云流中,队列名称上标有目的地,例如
mq-test.topic.aa.mq-test
我对春季云流的属性是这样的。
exchange name = mq-test.topic
routingKey = mq-test
queueName = aa.mq-test
我也代表bindingRoutingKey使用routingKeyExpression属性,但是结果是相同的。
有些遗留应用程序通过队列名称使用数据,而我的新应用程序仅在生产,因此我无法更改交换和队列名称策略。
如何保持与春季云流的交换/队列命名?
感谢您的帮助。
答案 0 :(得分:0)
请参阅RabbitMQ活页夹文档Using Existing Queues/Exchanges。
默认情况下,绑定器将自动提供主题交换,其名称是从目标绑定属性的值派生的。如果未提供,则目的地默认为绑定名称。绑定使用者时,将自动使用name设置队列。 (如果指定了组绑定属性),或者在没有组的情况下创建匿名自动删除队列。对于非分区绑定,队列将使用“ match-all”通配符路由键(#)绑定到交换机。前缀默认为空字符串。如果使用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
...