我们正在从现有的传统队列迁移到仲裁队列,其中一个要求是必须将队列使用声明为“passive”(即queueDeclarePassive)。这样做的目的是确保我们不动态创建任何队列,而只检查其是否存在(如果不存在则失败),然后进行连接。
我们有一个使用spring-amqp的遗留服务,我们这样设置SimpleMessageListenerContainer:
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queue().getName());
...
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.getConnectionFactory().createConnection().createChannel(false);
return rabbitTemplate;
}
我看不出有什么方法可以将队列声明为“passive”。在阅读spring.io文档时,我看到了对declarationRetries的描述:
当被动队列声明失败时得重试次数.当使用者启动时,或者当从多个队列使用时,当初始化期间不是所有队列都可用时,发生被动队列声明.
这是否意味着spring-amqp在幕后使用queueDeclarePassive?这是否在任何地方明确地记录下来?如果我不正确,我如何正确地确保queueDeclarePassive在这个amqp用法中使用?
提前感谢!
1条答案
按热度按时间k3bvogb11#
这是否意味着spring-amqp在幕后使用queueDeclarePassive?
它并没有暗示它,它明确地陈述了它。
queueDeclarePassive
由侦听器容器在启动期间使用,以验证配置的队列是否存在。默认情况下,
SimpleMessageListenerContainer
将尝试3次,每次间隔5秒,如果被动声明失败,容器将停止。尝试次数和间隔可以配置。如果队列不存在,
DirectMessageListenerContainer
将使用其monitorInterval
属性无限期地尝试被动声明队列。如果应用程序上下文包含
Queue
@Bean
,并且存在RabbitAdmin
@Bean
,Spring AMQP将仅执行非被动队列声明(队列创建)。