1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一文搞懂RabbitMQ的ack與nack

        共 1825字,需瀏覽 4分鐘

         ·

        2021-04-12 23:48

          點(diǎn)擊上方“JavaEdge”,關(guān)注公眾號

        設(shè)為“星標(biāo)”,好文章不錯過!


        使用 MQ 時,需要注意保證消息不會丟失且被準(zhǔn)確消費(fèi)。

        connection = factory.newConnection();      final Channel channel = connection.createChannel();channel.queueDeclare("隊(duì)列名", true, false, false, null);
        //第二個參數(shù)設(shè)為true為自動應(yīng)答,false為手動ackchannel.basicConsume("隊(duì)列名", true, new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { try { Thread.sleep(10000); System.out.println(new String(body, "UTF-8")); //模擬異常 int i = 1/0; //手動ack //channel.basicAck(envelope.getDeliveryTag(), false); } catch (Exception e) { //重新放入隊(duì)列 //channel.basicNack(envelope.getDeliveryTag(), false, true); //拋棄此條消息 //channel.basicNack(envelope.getDeliveryTag(), false, false); e.printStackTrace();
        }finally { } }});

        handleDelivery是回調(diào)方法,如果隊(duì)列中有消息就會執(zhí)行這個方法,參數(shù)中的body就是消息內(nèi)容。
        channel.basicConsume 方法中第二個參數(shù)為boolean 類型,意思是消息的ack 需要自動(true)還是手動(false)。

        ack機(jī)制為自動



        不管 try 中有沒有異常,消息管理界面上隊(duì)列里的消息都被消費(fèi)了,沒有了(ready和unacked狀態(tài)欄都沒有了),下面是管理界面, 隊(duì)列中的未被消費(fèi)的消息有多少條都會在ready狀態(tài)欄下,分發(fā)到消費(fèi)端后,消費(fèi)端沒有回發(fā)ack的消息會在unacked狀態(tài)欄中。

        手動ack應(yīng)答(channel.basicAck方法)



        這樣做的目的是保證消息在正確消費(fèi)后給回饋,說明我正確消費(fèi)了。這時隊(duì)列就可以把這條消息刪除了,如果消費(fèi)端接收了消息,但是沒有給返回ack應(yīng)答,那么這條消息會繼續(xù)存在unacked狀態(tài)下,占據(jù)隊(duì)列的空間,等到空間滿了,就會出現(xiàn)接下來的消息不能被消費(fèi)的情況。

        正確的消息被ack了,那么在消費(fèi)過程中發(fā)生異常怎么辦?該條消費(fèi)肯定不能返回ack應(yīng)答了,這時就需要channel.basicNack,該方法解決了消費(fèi)異常情況下該條消息怎么處理,有兩種辦法:

        1. 這條消息重新放回隊(duì)列,重新消費(fèi)

        2. 拋棄此條消息

        具體使用哪個方法,這種情況下,建議捕捉異常類型,判斷是哪種異常,再做具體處理。






        目前交流群已有 800+人,旨在促進(jìn)技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進(jìn)群


        喜歡文章,點(diǎn)個“在看、點(diǎn)贊、分享”素質(zhì)三連支持一下~

        瀏覽 73
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            18禁网站一区 | 亚洲激情二区 | 免费看肏屄视频 | 日本精品无码a 6 2v在线 | 自拍偷拍免费视频 | 操欧美老女人 | 亚洲欧洲无码一区二区三区 | 总裁开会呻吟双腿大开h | 国语久久 | 激情高潮呻吟抽搐喷水 |