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)认为不可恢复相关推荐

  1. 打开i信服务器正在运行中,【网络异常,0/12157 Unknown】i信登录时出现

    [网络异常,0/12157 Unknown]i信登录时出现 1.登陆i信时提示"登陆失败,错误原因:网络异常或网络错误,--Unknown",如下图示意,可能是您电脑为Window ...

  2. Docker 容器的运行(八)

    一.运行容器 1.运行第一个容器 现在,让我们尝试启动第一个 Docker 容器.我们可以使用docker run命令创建容器,docker run命令提供了 Docker 容器的创建到启动的功能. ...

  3. 线程池内运行的线程抛异常,线程池会怎么办

    线程池中实际运行的是线程池自身的线程,只是在runWorker方法中调用了我们传递进入Runnable对象的run()方法,那么如果run()方法中出现异常了,那么要怎么处理?会不会将我们的线程池停掉 ...

  4. 自己动手写Docker系列 -- 5.2实现查看运行中的容器

    简介 在上篇中我们实现了将容器后台运行,本篇中我们将实现docker的ps命令,查看当前正在运行中的容器列表 源码说明 同时放到了Gitee和Github上,都可进行获取 Gitee: https:/ ...

  5. C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常

    C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常 参考文章: (1)C# winform ...

  6. 4、Docker 提交运行中容器作为新的镜像

    1.查看docker镜像 提交容器副本使之成为一个新的镜像 docker images tomcat 2.运行docker 镜像(tomcat)成为容器 docker run -it -d -p 88 ...

  7. docker ps命令详解 列出运行中的容器

    docker ps命令详解 列出运行中的容器 使用docker ps命令即可列出运行中的容器,执行该命令后,会出现如下7列表格 CONTAINER_ID      表示容器ID IMAGE       ...

  8. OpenShift Security 15 - 用 RHACS 的安全策略管理运行中的容器安全

    <OpenShift 4.x HOL教程汇总> 本文在 OpenShift4.9 + RAHACS 环境中进行验证. 创建 RHACS 的 Policy 创建一个 Policy 的 JSO ...

  9. 如何给运行中的docker容器增加映射端口

    方式一: 宝塔面板下操作 点开Docker管理器 点击状态 停掉相应的容器 在点击状态管理 点击停止 停掉docker服务 然后在宿主机宝塔面板找到以下路径文件 例如:我们要新增容器3306端口映射到 ...

最新文章

  1. 揭秘:1.2亿美元光刻机内部视频曝光,像科幻片一样震撼!
  2. iOS 获取当前设备型号iPhone7/iPhone7P
  3. 阿里首席架构师科普RPC框架是什么
  4. Golang 编程思维和工程实战
  5. perl中的map和grep
  6. 解决微信小程序安卓手机访问不到图片,无法显示图片
  7. turtle fillcolor_Python编程:使用海龟turtle画图制作可爱的哆啦A梦,你也可以的。
  8. EDA技术实用教程 | 复习四 | 标识符、关键字和规范的书写格式
  9. H264格式 I帧 P帧 B帧 基础知识
  10. DC中保存ddc格式文件(亲测有效!)save the unmapped design in ddc format
  11. php表单提交并发送邮件给某个邮箱(示例源码)
  12. el-menu菜单下划线解决办法
  13. 弦外雨,晚风急 吹皱芳华太无情
  14. 怪物的生成 攻击和掉落金币
  15. 多元统计分析及R语言建模
  16. 用python开发一个炸金花小游戏,注意别玩上瘾了~~
  17. csgo社区服务器文件位置,csgo社区服务器在哪
  18. 通达OA 精灵登录时提示“库没有注册”(图文)
  19. ORA-01031 新建用户创建视图提示权限不足
  20. mysql触发器任务

热门文章

  1. Android 关于ListView中按钮监听的优化问题(方法二)
  2. Spring.NET 1.3.1 新特性探索系列2——WCF命名空间解析器
  3. 用GDI+转BMP为WMF、EXIF、EMF格式
  4. linux-安装jdk
  5. netty 为什么用nio 不用 aio
  6. Django学习笔记10
  7. 使用HOG+LBP实现动物分类:matlab版本
  8. html的!DOCTYPE标签初窥
  9. sdutoj 2624 Contest Print Server
  10. hdu 1050 Moving Tables