通过 Spring 云流或 rabbitmq 服务器配置将默认交换类型更改为扇出

Change default exchangeType as fanout through Spring cloud stream or rabbitmq server config

我有两个微服务学生和教师

在 Student 微服务中,我创建了用于交换 XYZ 的 MessageSink

@Input("XYZ")
SubscribableChannel xyz();

在 Teacher 微服务中,我将交换 XYZ 配置为扇出

application.properties

 spring.cloud.stream.rabbit.bindings.XYZ.producer.exchangeType=fanout
 spring.cloud.stream.bindings.XYZ.contentType=application/json

但我在这里面临的问题是学生服务在教师服务之前启动,并且正在创建类型为主题的 XYZ 交换。

为了解决这个问题,我在两个服务(即消费者和生产者)中都添加了 exchangeType。随着服务数量的增加,这些配置的数量也在增加。

我想将默认的 exchangeType 更改为 fanout,所以下面是几个问题。

  1. 有什么方法可以将默认 exchangeType 更改为扇出而不是 spring-cloud-stream 中的主题?
  2. 有什么方法可以通过 rabbit-mq 配置更改默认 exchangeType 吗?
  3. 作为解决方法,我计划将 exchangeType 保留为 topic 和路由键 #。但这种方法的问题是 stomp 客户端正在为每个浏览器主机创建队列,队列名称为 stomp-subscription-randomString 和空白路由键。那么有没有办法在订阅流的同时提供路由密钥呢?我正在使用 /exchange/exchangeName 作为交换 URL

有一些关于此事的文档:https://docs.spring.io/spring-cloud-stream/docs/Elmhurst.RELEASE/reference/htmlsingle/#_configuration_options_4

您可以考虑使用这个选项:

exchangeType

The exchange type: direct, fanout or topic for non-partitioned destinations and direct or topic for partitioned destinations.

Default: topic.

因此它在我们的配置中看起来像:

spring.cloud.stream.rabbit.bindings.XYZ.consumer.exchangeType=fanout

还有一些其他选项,例如:declareExchange=falsebindingRoutingKey 也需要考虑。