未调用setAdminsThatShouldDeclare时默认选中哪个RabbitAdmin?
多RabbitAdmin实例下未指定声明管理员的默认行为
当你未在Queue、Exchange等AMQP组件上调用setAdminsThatShouldDeclare方法指定负责声明的RabbitAdmin实例时,应用上下文中所有的RabbitAdmin实例都会自动尝试在自己关联的RabbitMQ服务上声明该组件。
这个是Spring AMQP的默认设计逻辑:RabbitAdmin实例初始化完成后,会扫描应用上下文中所有的Queue、Exchange、Binding类型的Bean,只要组件没有显式配置adminsThatShouldDeclare属性限制声明的管理员范围,该RabbitAdmin就会执行对应的声明操作。
注意事项
- 如果不同RabbitMQ实例上已经存在同名但属性(比如持久化配置、排他配置、死信路由配置等)不一致的队列/交换机,未指定范围的自动声明会抛出声明异常。你可以给RabbitAdmin配置
setIgnoreDeclarationExceptions(true)忽略这类异常,但更推荐显式指定每个组件对应的声明管理员避免歧义。 - 显式指定声明管理员的方式就是打开示例代码中注释的
setAdminsThatShouldDeclare调用,传入对应的RabbitAdmin实例即可,参考代码如下:
@Bean public Queue queue() { Queue queue = new Queue("foo"); // 仅admin1会声明该队列 queue.setAdminsThatShouldDeclare(admin1()); return queue; } @Bean public Exchange exchange() { DirectExchange exchange = new DirectExchange("bar"); // 仅admin2会声明该交换机 exchange.setAdminsThatShouldDeclare(admin2()); return exchange; }
内容的提问来源于stack exchange,提问作者uahakan
相关产品推荐
相关产品推荐

