容器和 Broker 命名的队列

虽然最好使用 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 很重要,因为容器很可能最初会尝试重新连接到旧队列。
© . This site is unofficial and not affiliated with VMware.