zoukankan      html  css  js  c++  java
  • RabbitMQ消费者抛异常日志持续打印的问题

    场景

    消费者接受消息,进行一系列处理,但是由于某些原因处理过程中该消费者的抛出了异常,并且不捕获(直接 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异常消息重复入队;

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

     

  • 相关阅读:
    hdu1078 记忆化搜索
    AC之路开始了~
    Balanced Lineup poj3264 线段树
    Billboard 题解 hdu2795
    Count Color poj2777 线段树
    D-query SPOJ 树状数组+离线
    Poj 3468 A Simple Problem with Integers 线段树
    最小生成树两大算法总结+模板
    最短路三大算法及其优化算法大总结+模板
    POJ-1502 MPI Maelstrom 迪杰斯特拉+题解
  • 原文地址:https://www.cnblogs.com/theRhyme/p/10758249.html
Copyright © 2011-2022 走看看