使用Rabbit MQ的Spring应用程序中的声明符

问题描述 投票:0回答:1

我正在使用spring aqmp 2.2.6版本来创建多个绑定到一个话题交换。我从讨论和参考文档中了解到,我可以使用可声明性。Spring AMQP:动态创建多个队列。

但在我的案例中,我将在应用程序配置中的路由键以逗号隔开,并且不断增加。我如何使用配置来动态创建可声明的Bean。下面是应用配置条目.rabbit.MQ_SUBSCRIBER_ROUTING_KEY = my.#,test.#。

当服务需要时,路由密钥将被添加进来。

我是否应该循环rabbit.MQ_SUBSCRIBER_ROUTING_KEY并调用bean函数?

spring-rabbit
1个回答
0
投票
my.queues=foo,bar,baz

Spring可以将其转换为 List<String>.

@Bean
public Declarables queues(@Value("${my.queues}") List<String> queues) {
    return new Declarables(queues
            .stream()
            .map(q -> new Queue(q))
            .collect(Collectors.toList())
            .toArray(new Queue[0]));
}

编辑

对于完整的画面。

@Bean
public Declarables declarables(@Value("${my.queues}") List<String> queues,
        @Value("${my.exchange}") String exch, 
        @Value("${my.routing.keys}") List<String> routingKeys) {

    List<Declarable> declarables = queues
                    .stream()
                    .map(q -> new Queue(q))
                    .collect(Collectors.toList());
    declarables.add(new DirectExchange(exch));
    for (int i = 0; i < routingKeys.size(); i++) {
        declarables.add(new Binding(queues.get(i), DestinationType.QUEUE, exch, 
                routingKeys.get(i), null));
    }
    return new Declarables(declarables
            .toArray(new Declarable[0]));
}
my.queues=foo,bar,baz
my.exchange=qux
my.routing.keys=rk1,rk2,rk3
© www.soinside.com 2019 - 2024. All rights reserved.