容器和代理命名队列
虽然最好使用`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`非常重要,因为容器很可能最初会尝试重新连接到旧队列。 |