以编程方式在 Spring Cloud Stream (RabbitMQ) 中声明绑定?

Programmatically declare bindings in Spring Cloud Stream (RabbitMQ)?

我有一个 Spring Cloud Stream 应用程序,它使用 RabbitMQ 绑定器来 使用 消息(它不产生任何消息)。 application.yaml 文件如下所示:

spring:
  cloud:
    stream:
      rabbit:
        bindings:
          x:
            consumer:
              bindingRoutingKey: x.z.#
              queueNameGroupOnly: true
          y:
            consumer:
              bindingRoutingKey: y.z.#
              queueNameGroupOnly: true
      bindings:
        x:
          binder: rabbit
          group: q1
          destination: x
        y:
          binder: rabbit
          group: q2
          destination: y

这将在 RabbitMQ 中创建两个队列:

  1. q1 与路由密钥 x.z.#
  2. 绑定交换 x
  3. q2 与路由键 y.z.#
  4. 绑定交换 y

我想创建一个单个队列,它使用多个交换器和路由键。我知道我无法将交换绑定到 application.yaml 中的多个路由键(参见 SO 问题),因此我怀疑我无法配置 Spring Cloud Stream 以使用多个单个绑定的目的地(交换)。

所以我的问题是,我可以通过编程方式声明一个 binding 从多个交换中消费吗?如果这样做,是否需要在 application.yaml 文件中保留任何内容?

我该怎么办?

您可以使用交换到交换绑定来满足此要求。

x -> z
y -> z

然后从与 # 绑定的 z 上的单个队列中消费。

您可以在您的引导应用程序中将交换定义为交换绑定,如@Bean s.