记一次rabbitmq设置手动ack报错:Channel closed; cannot ack/nack

  • 报错内容
  • 前置条件
  • 出现错误情况
  • 出现问题原因
  • 解决办法

报错内容

java.lang.IllegalStateException: Channel closed; cannot ack/nackat org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:1181)at com.sun.proxy.$Proxy216.basicAck(Unknown Source)

前置条件

使用了nacos作为服务注册,rabbitmq的配置文件设置了手动ack,yml文件也是相同配置,配置文件如下:

 listener:simple:acknowledge-mode: manual #采取手动应答retry:enabled: true # 是否支持重试

mq工厂配置:

 @Beanpublic RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setMessageConverter(new Jackson2JsonMessageConverter());return factory;}

消费者代码如下:

  /*** 处理消息* @param plan* @param channel* @param message* @throws IOException*/@RabbitHandlerpublic void handle(@Payload HdPlanResponse plan, Channel channel, Message message) throws IOException {LOGGER.info("receive message plan:{}",plan);try{hdMessageService.saveMessageByType(plan);channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);}catch (Exception e){LOGGER.error("消费失败原因:",e);LOGGER.info("消费失败重试 plan:{}",plan);if(message.getMessageProperties().getRedelivered()){LOGGER.info("重复失败丢弃消息 plan:{}",plan);channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);}else{channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,true);}}}

出现错误情况

当同时发送两条mq消息同时消费的时候,第一条mq消息是没有问题的,但是从第二条开始就会报错:

java.lang.IllegalStateException: Channel closed; cannot ack/nackat org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:1181)at com.sun.proxy.$Proxy216.basicAck(Unknown Source)at com.lishicloud.datacenter.red.manage.message.PlanMessageReceiver.handle(PlanMessageReceiver.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.invoke(DelegatingInvocableHandler.java:130)at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:66)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:220)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:148)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:133)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1579)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1498)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1486)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1477)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1421)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:963)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:81)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1284)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1190)at java.lang.Thread.run(Thread.java:748)

出现问题原因

虽然我们配置文件里设置了手动ack,但是我们在工厂里设置了自己的json解析器,如果设置了自己的json解析器就会导致配置文件里的手动ack配置失效,具体原因应该是rabbitmq的配置加载顺序问题

解决办法

需要在工厂类里再次重新设置一下手动ack,代码如下:

    @Beanpublic RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setMessageConverter(new Jackson2JsonMessageConverter());factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);             //开启手动 ackreturn factory;}

rabbitmq设置手动ack报错:Channel closed; cannot ack/nack相关推荐

  1. Windows server 2012R2 设置文件共享目录报错:无法连接到C$管理共享已验证文件夹xxx在计算机xxx上是否存在

    Windows server 2012R2 设置文件共享目录报错:无法连接到C$管理共享已验证文件夹xxx在计算机xxx上是否存在 问题描述: Windows server 2012R2 机器,在安装 ...

  2. 计算机防火墙不能更改,win7无法更改防火墙设置提示系统报错怎么办

    防火墙也称防护墙,是一种位于内部网络与外部网络之间的网络安全系统,可以防止病毒入侵.有位 Win7系统 用户想更改防火墙某些设置,出现无法更改的情况,系统报错"0x80074200" ...

  3. ionic4 背景设置动态图片报错WARNING: sanitizing unsafe style value background-image:url

    ionic4 背景设置动态图片报错WARNING: sanitizing unsafe style value background-image:url WARNING: sanitizing uns ...

  4. mysql创建外键时1025_navicat设置外键报错1025怎么办

    navicat设置外键报错1025怎么办,字段,类型,表字,给大家,报错 navicat设置外键报错1025怎么办 易采站长站,站长之家为您整理了navicat设置外键报错1025怎么办的相关内容. ...

  5. mysql 5.7 1819_MySQL 5.7设置简单密码报错ERROR 1819 (HY000)

    MySQL 5.7设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements. ...

  6. mysql8.0 设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    mysql8.0 设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements ...

  7. RabbitMq 测试报错channel error(reply-code=405

    今天在学习rabbitmq 消息队列的时候启动 生成者后 在启动消费者 会报错错误信息为 channel error; protocol method: #method<channel.clos ...

  8. 手动制造报错_Windows 10驱动更新调整:不再自动安装“手动”驱动更新

    正如上月月底放出的公告,微软已经对 Windows 10 驱动更新进行了调整.虽然这项新调整的目的是为了改善整体体验,但在极少数情况下可能会给某些用户带来麻烦. 01 Windows 10驱动更新调整 ...

  9. EasyCVR调用云端录像接口报错“Channel[5] Not Enabled“处理

    EasyCVR视频协议融合平台不仅支持常规协议的接入,我们还拓展了海康SDK.大华SDK.Ehome等私有协议.如果前端设备协议不同且数量较多,则可以通过EasyCVR平台来对所有视频通道做整合和统一 ...

最新文章

  1. 搜索:深搜/广搜 获取岛屿数量
  2. 检查联网状态并设置网络
  3. .configure
  4. php 多维数组 列,总结PHP实现提取多维数组指定一列的方法
  5. Powershell About Active Directory Group Membership of a domain user
  6. VS修改生成应用图标
  7. vue中使用使用阿里云的iconfont
  8. excel游戏_Excel集中游戏
  9. Android同步时出错,Android Studio中的Gradle给出错误项目同步失败
  10. 白+黑(白利用)漏洞加载木马技术解析
  11. fatal: unable to access ‘https://github.com/thm123/algos.git/‘: Received HTTP code 400 from proxy af
  12. chan算法 matlab,TDOA定位的Chan算法MATLAB源代码
  13. 时钟相位噪声测量中的杂散
  14. .net中对象名无效问题解决
  15. sap增加税码注意事项,进项税调整SAP相应调整
  16. 磁带储存拥有的4大优势
  17. 辐射骚扰测试软件,电磁兼容EMC测试
  18. 【转】三款免费的在线项目管理工具
  19. 邮件服务器问题--邮件积压、传递延迟解决方法
  20. java 开源 文件同步_利用开源项目使discus论坛与java应用同步登录和注册

热门文章

  1. windows计划任务 0xff_Windows服务器入侵检测排查方法
  2. JavaScript 基础知识
  3. 30岁有哪些方向可以转型?
  4. 如何通俗地解释欧拉公式(e^πi+1=0)
  5. javaee图书管理系统mysql,图书管理系统设计与实现—看这篇就够了
  6. EMV技术学习和研究(九)终端行为分析
  7. Android模拟点击的四种方式
  8. JavaWeb学习笔记(JavaScript)
  9. 【网络原理】一个数据包从发送到接收在网络中经历了那些过程(详细分析)
  10. 解决:“由于可能不会将凭据发送到远程计算机,因此将不会进行连接。若要获得协助,请与您的系统管理员联系”