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。

open a new feature issue.

我是这样解决的:

@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;
}

作者:https://docs.spring.io/spring-amqp/docs/1.4.5.RELEASE/reference/html/amqp.html#conditional-declaration