容器与 Broker 命名队列
虽然更推荐使用 AnonymousQueue 实例作为自动删除队列,但从版本 2.1 开始,你可以在监听器容器中使用 Broker 命名队列。下例展示了如何这样做:
@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(),以便容器在运行时能够访问声明的名称。仅设置名称是不够的。
备注
容器运行时,你不能向其中添加 Broker 命名队列。
important
当连接被重置并建立新连接时,新队列会获得一个新名称。由于容器重启与队列重新声明之间存在竞态条件,务必将容器的 missingQueuesFatal 属性设置为 false,因为容器很可能最初会尝试重连到旧队列。