容器与代理命名队列
虽然更推荐使用 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;
}
请注意 name
为空字符串的情况。当 RabbitAdmin
声明队列时,它会使用代理返回的名称更新 Queue.actualName
属性。为了使容器能够在运行时访问声明的名称,在配置容器时你必须使用 setQueues()
方法。仅仅设置名称是不够的。
备注
在容器运行时,您无法向其中添加 broker-named 队列。
important
当连接重置并建立新连接时,新队列会获得一个新名称。由于容器重启和队列重新声明之间存在竞争条件,因此将容器的 missingQueuesFatal
属性设置为 false
非常重要,因为容器最初可能会尝试重新连接到旧队列。