场景

消费者接受消息,进行一系列处理,但是由于某些原因处理过程中该消费者的抛出了异常,并且不捕获(直接 throws IOException 抛出去);

由于抛出了IOException,那么这条消息就会再次被发送到该队列,消费者就再次收到,而消费者抛出异常,该消息又会入队……所以就形成了一个死循环(除非不再有类似IO的异常),那么控制台日志就一直打印该消费者的抛出异常。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

 

下面模拟消费者收到一条消息,抛出IOException 没有捕获

RabbitMQ消费者抛异常日志持续打印的问题 随笔 第1张

 

控制台一直抛出异常,打印堆栈

RabbitMQ消费者抛异常日志持续打印的问题 随笔 第2张

RabbitMQ消费者抛异常日志持续打印的问题 随笔 第3张

 就算把这个消费者停了,然后再启动这个消费者依然后报错,因为这个队列的消息一直没有被该消费者消费。

 

 

解决办法:(推荐)当消费者把该异常内部捕获了,不再抛出去

RabbitMQ消费者抛异常日志持续打印的问题 随笔 第4张

 

就只会进入catch打印一次堆栈,该队列的消息就被该消费者消费了。

RabbitMQ消费者抛异常日志持续打印的问题 随笔 第5张

 

 

抛出AmqpRejectAndDontRequeueException异常

RabbitMQ消费者抛异常日志持续打印的问题 随笔 第6张

 

抛出这个异常后,表示该消费者监听的队列不要因为抛出AmqpRejectAndDontRequeueException异常消息重复入队;

控制台也只打印了该错误日志,该队列刚收到的消息已被该消费者消费

 RabbitMQ消费者抛异常日志持续打印的问题 随笔 第7张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄