如何禁止@RabbitListener自动创建跨微服务的不存在队列避免报错
解决方案
你可以通过以下配置关闭自动队列声明逻辑,同时避免队列不存在时抛出启动异常:
方案1:全局配置(适配你当前Spring Boot/Spring Cloud版本)
直接在yaml配置文件中新增如下配置:
spring: rabbitmq: listener: simple: # 关闭队列声明失败后的重试 declaration-retries: 0 # 队列不存在时不视为致命错误,不会终止应用启动 missing-queues-fatal: false # 全局关闭RabbitAdmin自动声明上下文内的Queue/Exchange/Binding Bean autoconfigure: amqp: dynamic: false cloud: stream: rabbit: bindings: # 针对accountingChannel的消费者关闭自动声明交换器、队列、绑定关系 accountingChannel: consumer: declare-exchange: false declare-queue: false bind-queue: false
方案2:针对指定@RabbitListener单独配置
如果不需要全局生效,可自定义监听容器工厂,仅给需要的监听器使用:
- 先自定义监听容器工厂
@Bean public SimpleRabbitListenerContainerFactory noDeclareContainerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setDeclarationRetries(0); factory.setMissingQueuesFatal(false); // 关闭容器启动时的队列声明 factory.setAutoDeclare(false); return factory; }
- 在@RabbitListener注解中指定使用该工厂
@RabbitListener(queues = AccountProcessor.ACCOUNTING_RESPONSE_CHANNEL+".account", containerFactory = "noDeclareContainerFactory") public void transferMoneyResponse(TransactionResponse transferOk) { merchantRequestService.updateStatusAfterStream(transferOk.getTransactionId()); }
额外注意事项
- 若你不需要当前服务声明
accountingChannel队列,可以直接删除SwitchStreamConfig类中声明accQueue的@Bean方法,避免自动声明和其他服务的队列配置冲突。 - 配置生效后,队列不存在时监听器会后台定期重试连接,等其他服务创建对应队列后会自动接入消费,不会影响当前服务正常启动。
内容的提问来源于stack exchange,提问作者Amir Azizkhani
相关产品推荐
相关产品推荐

