请使用 Spring AMQP 4.0.2(最新稳定版本)!spring-doc.cadn.net.cn

容器和代理命名队列

虽然更倾向于使用 AnonymousQueue 实例作为自动删除队列,但从 2.1 版本开始,您也可以使用代理命名队列与监听容器配合使用。以下示例展示了如何实现这一点:spring-doc.cadn.net.cn

@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 声明队列时,它会将 broker 返回的名称更新到 Queue.actualName 属性中。您必须使用 setQueues() 来配置容器,以便容器能够在运行时访问已声明的名称。仅设置名称是不够的。spring-doc.cadn.net.cn

您无法在容器运行时向其中添加命名的代理队列。
当连接被重置并建立新的连接时,新队列会获得一个新的名称。

spring-doc.cadn.net.cn

由于容器重启与队列重新声明之间存在竞争条件,因此重要的是将容器的 missingQueuesFatal 属性设置为 false,因为容器很可能最初尝试重新连接到旧队列。spring-doc.cadn.net.cn