RabbitAdmin 中的默认队列绑定
Default queue binding in RabbitAdmin
今天,我们的应用程序有一个 vhost、一个 ConnectionFactory 和一个 RabbitAdmin,后跟多个队列和交换声明。现在我们有一个要求,我需要一个新的虚拟主机,因此需要一个 ConnectionFactory & RabbitAdmin
创建新虚拟主机后,我面临的问题是,所有现有队列和交换都在两个虚拟主机中创建。为了解决这个问题,我使用了 declare-by="RabbitAdminName"
属性 ,我可以在队列和交换级别使用它。由于我的应用程序有多个队列和交换,因此我不希望通过在每个队列定义中添加 declare-by 来扰乱所有现有配置。
有没有办法(更改默认行为的全局配置)告诉兔子只有预期的新队列才会转到新的 vhost/ConnectoinFactory/RabbitAdmin 而不是已经存在的队列。非常感谢任何帮助(我正在寻找 xml 减速方式)
By default, all queues, exchanges, and bindings are declared by all
RabbitAdmin instances (that have auto-startup="true") in the
application context.
参考:spring.io
目前没有全局设置;您必须配置每个队列等并设置 declare-by
属性 以将声明限制为显式管理员。
因此您需要对旧队列执行此操作,以便仅在旧虚拟主机上声明这些队列。
我们可以向管理员添加一个标志,以排除任何未明确请求此管理员声明的 bean。
我是这样解决的:
@Bean
public RabbitAdmin admin() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(cf1());
rabbitAdmin.afterPropertiesSet();
return rabbitAdmin;
}
@Bean
public RabbitAdmin admin2() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(cf2());
rabbitAdmin.afterPropertiesSet();
return rabbitAdmin;
}
@Bean
public Queue queue() {
Queue queue = new Queue("foo");
queue.setAdminsThatShouldDeclare(admin());
return queue;
}
@Bean
public Exchange exchange() {
DirectExchange exchange = new DirectExchange("bar");
exchange.setAdminsThatShouldDeclare(admin());
return exchange;
}
@Bean
public Binding binding() {
Binding binding = new Binding("foo", DestinationType.QUEUE, exchange().getName(), "foo", null);
binding.setAdminsThatShouldDeclare(admin());
return binding;
}
今天,我们的应用程序有一个 vhost、一个 ConnectionFactory 和一个 RabbitAdmin,后跟多个队列和交换声明。现在我们有一个要求,我需要一个新的虚拟主机,因此需要一个 ConnectionFactory & RabbitAdmin
创建新虚拟主机后,我面临的问题是,所有现有队列和交换都在两个虚拟主机中创建。为了解决这个问题,我使用了 declare-by="RabbitAdminName"
属性 ,我可以在队列和交换级别使用它。由于我的应用程序有多个队列和交换,因此我不希望通过在每个队列定义中添加 declare-by 来扰乱所有现有配置。
有没有办法(更改默认行为的全局配置)告诉兔子只有预期的新队列才会转到新的 vhost/ConnectoinFactory/RabbitAdmin 而不是已经存在的队列。非常感谢任何帮助(我正在寻找 xml 减速方式)
By default, all queues, exchanges, and bindings are declared by all RabbitAdmin instances (that have auto-startup="true") in the application context.
参考:spring.io
目前没有全局设置;您必须配置每个队列等并设置 declare-by
属性 以将声明限制为显式管理员。
因此您需要对旧队列执行此操作,以便仅在旧虚拟主机上声明这些队列。
我们可以向管理员添加一个标志,以排除任何未明确请求此管理员声明的 bean。
我是这样解决的:
@Bean
public RabbitAdmin admin() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(cf1());
rabbitAdmin.afterPropertiesSet();
return rabbitAdmin;
}
@Bean
public RabbitAdmin admin2() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(cf2());
rabbitAdmin.afterPropertiesSet();
return rabbitAdmin;
}
@Bean
public Queue queue() {
Queue queue = new Queue("foo");
queue.setAdminsThatShouldDeclare(admin());
return queue;
}
@Bean
public Exchange exchange() {
DirectExchange exchange = new DirectExchange("bar");
exchange.setAdminsThatShouldDeclare(admin());
return exchange;
}
@Bean
public Binding binding() {
Binding binding = new Binding("foo", DestinationType.QUEUE, exchange().getName(), "foo", null);
binding.setAdminsThatShouldDeclare(admin());
return binding;
}