容器和代理命名的队列

虽然最好将 AnonymousQueue 实例用作自动删除队列,但从 2.1 版本开始,您可以在侦听器容器中使用代理命名的队列。以下示例显示如何执行此操作

@Bean
public Queue queue() {
    return new Queue("", false, true, true);
}

@Bean
public SimpleMessageListenerContainer container() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf());
    container.setQueues(queue());
    container.setMessageListener(m -> {
        ...
    });
    container.setMissingQueuesFatal(false);
    return container;
}

注意名称的空 String。当 RabbitAdmin 声明队列时,它会使用代理返回的名称更新 Queue.actualName 属性。配置容器时,您必须使用 setQueues() 才能使此方法起作用,以便容器在运行时可以访问声明的名称。仅设置名称是不够的。

您无法在容器运行时向容器添加代理命名的队列。
当连接重置并建立新连接时,新队列将获得一个新名称。由于容器重新启动和队列重新声明之间存在竞争条件,因此将容器的 missingQueuesFatal 属性设置为 false 非常重要,因为容器最初很可能会尝试重新连接到旧队列。