如何在 RabbitMQ Spring 框架中使用 "Declarables" 动态创建绑定

How to dynamically create bindings using "Declarables" in RabbitMQ Spring Framework

我的代码获取用户的输入,这是一个路由键列表,并使用它们将队列与交换绑定。我使用 Declarables 为每个路由键生成绑定。问题是,用户输入的路由键的数量每次都不同。考虑到路由键列表在数组上,如何使用这些路由键将队列绑定到交换。下面是我当前的代码。

@Bean
public Declarables bindings() {
    return new Declarables(
            BindingBuilder.bind(queue()).to(exchange()).with(routingKey[0]),
            BindingBuilder.bind(queue()).to(exchange()).with(routingKey[1]),
            BindingBuilder.bind(queue()).to(exchange()).with(routingKey[2])
    );
}

编辑 - 添加确切的用例以更加清晰:

我正在使用 rabbitmq 事件交换插件来使用内部事件 (https://www.rabbitmq.com/event-exchange.html)。我正在创建一个队列并将其与插件创建的交换 (amq.rabbitmq.event) 绑定。不同类型的事件可以通过绑定各自的路由键来消费。

我每次都从用户那里获取路由键列表,并将其绑定到交换 amq.rabbitmq.event 并使用相应的事件(例如 queue.created、user.authentication.success 等)。用户将所有路由键作为逗号分隔值添加到 application.properties 文件中。我解析它并将这些值添加到一个数组中,并为该数组中的所有元素(路由键)创建绑定。此列表的大小不是恒定的。用户每次可以输入 3 个路由键或 5 个或不同数量的键,我必须为每个路由键创建一个绑定。

在上面的代码中,为 3 个路由键(routingKey[0]、routingKey[1] 和 routingKey[2])创建了绑定。如果用户输入超过 3 个路由键会怎样以及如何为所有路由键创建绑定。

the number of routing keys that the user inputs varies each time.

从您的描述中不清楚您是静态还是动态需要可变数量的路由键。

您可以使用 RabbitAdmin.declareBinding(...) 在运行时(动态)声明绑定。

但是,这不应在 @Bean 定义中使用。

编辑

根据您更新的描述; Spring 会自动将逗号分隔的列表转换为 List.

routing.keys=foo,bar,baz
@Bean
public Declarables bindings(@Value("${routing.keys}") List<String> keys) {
    return new Declarables(keys.stream()
            .map(key -> BindingBuilder.bind(queue()).to(exchange()).with(key))
            .collect(Collectors.toList()));
}