笔者作为一个rabbitmq 菜鸟用户,在使用过程中遇到了一些问题,面向百度编程后也解决了一些问题。但一直存在一个困扰了很久的bug,期间不得不面向GitHub,Stack Overflow编程,然而其一对rabbitmq了解太浅,其二不知道出现bug的根本原因,其三英文水平实在堪忧查了等于白查。最终偶然在控制台日志看到了一条日志,顿时灵光乍现,身心仿佛龙卷风摧毁停车场一样畅快。
问题原因:提示:发送消息数据量少的情况下并不会出现异常,只有在数据量较大时,消费端短时间内处理不完数据时会出现Channel closed; cannot ack/nack的异常。
例如:当消费端需要花半个小时以上才确认回执时,此时在mq管理控制台页面会出现:Queued messages 有Total,Ready或者Unacked,但是在Consumers里显示为 no consumers。然后等消息处理完回执时,信道已经关闭,直接报错。接着灾难来了,由于消息无法确认回执,返回队列后又重新推送,信道打开,半小时后信道关闭,确认回执时又报异常,消息又返回队列出于Ready,Unacked状态,死循环(笔者的项目一直发了三四天…)。
在信道关闭时就会出现一个rabbitmq channel shutdown: timed out异常,带有rabbitmq Timeout by default is 30 minutes字样。这个错在半小时后出现,所以笔者一直没发现。
我的解决方案:设置一下消费超时时间即可,单位为毫秒。详情见: rabbitmq官网确认超时.
笔者rabbitmq所在服务器没有rabbitmq.conf配置文件,所以修改了advanced.config。这里出现了一个小插曲,在关闭rabbitmq服务后install时终端出现RabbitMQ service is already present - only updating service parameters这样一行字,一百度清一色的卸载重装一时给我整不会了。可以先remove掉再install然后start启动服务(还好有指令提示这种东西)。
关于rabbitmq配置文件参考了: 简书的一篇文章。



