<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文搞懂RabbitMQ的ack與nack

          共 1825字,需瀏覽 4分鐘

           ·

          2021-04-12 23:48

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

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


          使用 MQ 時,需要注意保證消息不會丟失且被準確消費。

          connection = factory.newConnection();      final Channel channel = connection.createChannel();channel.queueDeclare("隊列名", true, false, false, null);
          //第二個參數(shù)設(shè)為true為自動應答,false為手動ackchannel.basicConsume("隊列名", 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) { //重新放入隊列 //channel.basicNack(envelope.getDeliveryTag(), false, true); //拋棄此條消息 //channel.basicNack(envelope.getDeliveryTag(), false, false); e.printStackTrace();
          }finally { } }});

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

          ack機制為自動



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

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



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

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

          1. 這條消息重新放回隊列,重新消費

          2. 拋棄此條消息

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






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


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

          瀏覽 73
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费一级婬片A片女人不叫 | 日韩中文字幕在线人成网站 | 黃色A片一级一级一级久别的草原 | 免费黄色视频国产 | 手机看片在线播放联合毛片 |