RabbitMQ消费者抛异常日志持续打印的问题

探讨了在消息队列中,消费者抛出未捕获的IOException导致消息重复入队形成死循环的问题。介绍了通过捕获异常和抛出AmqpRejectAndDontRequeueException来避免消息重复入队的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

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

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

所以,如果不需要消费者抛出异常后消息重新入队,就需要将异常捕获。

 

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

 

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

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

 

 

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

保险起见,可以把整个方法体的内容进行try,然后捕获异常,具体操作如下:

public void consumerMethod(Param param){
  try{
      // 比如解析body,业务操作
  } catch(IOException e){
     // 比如打印日志,异常堆栈
  } catch(NullPointerException e){
     // 比如打印日志,异常堆栈
  } catch(Exception e){
    // 比如打印日志,异常堆栈
  }          
}    

 

 

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

 

 

抛出AmqpRejectAndDontRequeueException异常

 

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

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

 

 

转载于:https://www.cnblogs.com/theRhyme/p/10758249.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值