rabbitmq容器在运行中会根据异常等级(Fatal)认为不可恢复
spring amqp rabbitmq容器在運行中會根據異常等級(Fatal)認為不可恢復,重試后會關閉。本文分享導致關閉的一個場景,以及如何配置來恢復連接。
異常日志
異常日志 Cancel received for? ***Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: org.springframework.amqp.rabbit.support.ConsumerCancelledExceptionRestarting Consumer:?Failed to check/redeclare auto-delete queue(s). org.springframework.amqp.AmqpIOException: java.io.IOExceptionFailed to declare queueQueue declaration failed; retries left=3 org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s): xxx_queueConsumer received fatal exception on startup org.springframework.amqp.rabbit.listener.QueuesNotAvailableException: Cannot prepare queue for listener. Either the queue doesn't exist or the broker will not allow us to use it.at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:539)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.Stopping container from aborted consumer問題說明
spring amqp rabbitmq 使用中遇到 rabbitmq服務端因為某些問題,比如重啟(生產一般很少發生),權限配置錯誤,誤操作(誤刪隊列)等導致服務端短期連接不上時,org.springframework.amqp:spring-rabbit:1.7.8.RELEASE (2.0版本可能也是,未測試),默認采取的策略是重試3次(Queue declaration failed; retries left=3?),每次相隔5秒。如果仍然連接不上,并且當前rabbitmq container 沒有其他隊列的情況,則會關閉(Stopping container from aborted consumer)。即使rabbitmq server恢復之后(以上種種誤操作),是不會重連,并繼續消費的。
正確配置
@Bean(name ="xxxContainerFactory")public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,@Qualifier("xxxConnectionFactory")ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory =new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setAcknowledgeMode(AcknowledgeMode.AUTO);factory.setPrefetchCount(1);factory.setRecoveryInterval(5000L);factory.setMissingQueuesFatal(false);configurer.configure(factory,connectionFactory);return factory;}設置factory.setMissingQueuesFatal(false),其中missingQueuesFatal.設置為true(默認值)時,如果 broker 上的 none 配置隊列可用,則認為它是致命的。這會導致 application context 在啟動期間無法初始化;此外,當容器正在運行時刪除隊列時,默認情況下,消費者進行 3 次重試以連接到隊列(間隔為 5 秒)并在這些嘗試失敗時停止容器。
在以前的版本中無法配置。
設置為false時,在進行 3 次重試后,容器將進入恢復模式,與其他問題一樣,例如 broker 已關閉。容器將嘗試根據recoveryInterval?property 進行恢復。在每次恢復嘗試期間,每個 consumer 將再次嘗試 4 次以 5 秒間隔被動地聲明隊列。這個 process 將無限期地繼續。
配置介紹
更多其他配置項含義官方有詳細說明。
英語(官方):
https://docs.spring.io/spring-amqp/reference/html/#containerAttributes
中文:
https://www.docs4dev.com/docs/zh/spring-amqp/1.7.11.RELEASE/reference/_reference.html
總結
以上是生活随笔為你收集整理的rabbitmq容器在运行中会根据异常等级(Fatal)认为不可恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMq queue异常导致co
- 下一篇: Springboot-RabbitMq