rabbitmq设置手动ack报错:Channel closed; cannot ack/nack
记一次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相关推荐
- Windows server 2012R2 设置文件共享目录报错:无法连接到C$管理共享已验证文件夹xxx在计算机xxx上是否存在
Windows server 2012R2 设置文件共享目录报错:无法连接到C$管理共享已验证文件夹xxx在计算机xxx上是否存在 问题描述: Windows server 2012R2 机器,在安装 ...
- 计算机防火墙不能更改,win7无法更改防火墙设置提示系统报错怎么办
防火墙也称防护墙,是一种位于内部网络与外部网络之间的网络安全系统,可以防止病毒入侵.有位 Win7系统 用户想更改防火墙某些设置,出现无法更改的情况,系统报错"0x80074200" ...
- ionic4 背景设置动态图片报错WARNING: sanitizing unsafe style value background-image:url
ionic4 背景设置动态图片报错WARNING: sanitizing unsafe style value background-image:url WARNING: sanitizing uns ...
- mysql创建外键时1025_navicat设置外键报错1025怎么办
navicat设置外键报错1025怎么办,字段,类型,表字,给大家,报错 navicat设置外键报错1025怎么办 易采站长站,站长之家为您整理了navicat设置外键报错1025怎么办的相关内容. ...
- 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. ...
- 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 ...
- RabbitMq 测试报错channel error(reply-code=405
今天在学习rabbitmq 消息队列的时候启动 生成者后 在启动消费者 会报错错误信息为 channel error; protocol method: #method<channel.clos ...
- 手动制造报错_Windows 10驱动更新调整:不再自动安装“手动”驱动更新
正如上月月底放出的公告,微软已经对 Windows 10 驱动更新进行了调整.虽然这项新调整的目的是为了改善整体体验,但在极少数情况下可能会给某些用户带来麻烦. 01 Windows 10驱动更新调整 ...
- EasyCVR调用云端录像接口报错“Channel[5] Not Enabled“处理
EasyCVR视频协议融合平台不仅支持常规协议的接入,我们还拓展了海康SDK.大华SDK.Ehome等私有协议.如果前端设备协议不同且数量较多,则可以通过EasyCVR平台来对所有视频通道做整合和统一 ...
最新文章
- 搜索:深搜/广搜 获取岛屿数量
- 检查联网状态并设置网络
- .configure
- php 多维数组 列,总结PHP实现提取多维数组指定一列的方法
- Powershell About Active Directory Group Membership of a domain user
- VS修改生成应用图标
- vue中使用使用阿里云的iconfont
- excel游戏_Excel集中游戏
- Android同步时出错,Android Studio中的Gradle给出错误项目同步失败
- 白+黑(白利用)漏洞加载木马技术解析
- fatal: unable to access ‘https://github.com/thm123/algos.git/‘: Received HTTP code 400 from proxy af
- chan算法 matlab,TDOA定位的Chan算法MATLAB源代码
- 时钟相位噪声测量中的杂散
- .net中对象名无效问题解决
- sap增加税码注意事项,进项税调整SAP相应调整
- 磁带储存拥有的4大优势
- 辐射骚扰测试软件,电磁兼容EMC测试
- 【转】三款免费的在线项目管理工具
- 邮件服务器问题--邮件积压、传递延迟解决方法
- java 开源 文件同步_利用开源项目使discus论坛与java应用同步登录和注册
热门文章
- windows计划任务 0xff_Windows服务器入侵检测排查方法
- JavaScript 基础知识
- 30岁有哪些方向可以转型?
- 如何通俗地解释欧拉公式(e^πi+1=0)
- javaee图书管理系统mysql,图书管理系统设计与实现—看这篇就够了
- EMV技术学习和研究(九)终端行为分析
- Android模拟点击的四种方式
- JavaWeb学习笔记(JavaScript)
- 【网络原理】一个数据包从发送到接收在网络中经历了那些过程(详细分析)
- 解决:“由于可能不会将凭据发送到远程计算机,因此将不会进行连接。若要获得协助,请与您的系统管理员联系”