国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列

這篇具有很好參考價值的文章主要介紹了【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列

???????????????????????????????????????????????????????????????????? 【 R a b b i t M Q 教 程 】 第 五 章 — — R a b b i t M Q ? 死 信 隊 列 \color{#FF1493}{【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列} RabbitMQRabbitMQ??? ?????????


?? 仰望天空,妳我亦是行人.?
?? 個人主頁——微風(fēng)撞見云的博客??
?? 《數(shù)據(jù)結(jié)構(gòu)與算法》專欄的文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~??
?? 《Java學(xué)習(xí)筆記》專欄的文章是本人在Java學(xué)習(xí)中總結(jié)的一些知識點~ ??
?? 《每天一點小知識》專欄的文章可以豐富你的知識庫,滴水成河~ ??
?? 《RabbitMQ》專欄的文章是在學(xué)習(xí)尚硅谷課程時整理的筆記,方便復(fù)習(xí)鞏固~ ??
?? 希望本文能夠給讀者帶來一定的幫助~??文章粗淺,敬請批評指正!??



??RabbitMQ - 死信隊列

死信的概念

先從概念解釋上搞清楚這個定義,死信,顧名思義就是無法被消費的消息,字面意思可以這樣理 解,一般來說,producer 將消息投遞到 broker 或者直接到queue 里了,consumer 從 queue 取出消息 進(jìn)行消費,但某些時候由于特定的原因?qū)е?queue 中的某些消息無法被消費,這樣的消息如果沒有后續(xù)的處理,就變成了死信,有死信自然就有了死信隊列。

應(yīng)用場景:為了保證訂單業(yè)務(wù)的消息數(shù)據(jù)不丟失,需要使用到 RabbitMQ 的死信隊列機制,當(dāng)消息消費發(fā)生異常時,將消息投入死信隊列中。還有比如說:用戶在商城下單成功并點擊去支付后在指定時間未支付時自動失效

#死信的來源

死信的來源

  • 消息 TTL 過期

    TTL是Time To Live的縮寫, 也就是生存時間

  • 隊列達(dá)到最大長度

    隊列滿了,無法再添加數(shù)據(jù)到 mq 中

  • 消息被拒絕

    (basic.reject 或 basic.nack) 并且 requeue=false.

死信實戰(zhàn)

【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列

死信之 T T l

消費者 C1 代碼:

/**
 * 死信隊列 - 消費者01
 */
public class Consumer01 {

    //普通交換機名稱
    private static final String NORMAL_EXCHANGE = "normal_exchange";
    //死信交換機名稱
    private static final String DEAD_EXCHANGE = "dead_exchange";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();

        //聲明死信和普通交換機 類型為 direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        //聲明死信隊列
        String deadQueue = "dead-queue";
        channel.queueDeclare(deadQueue, false, false, false, null);
        //死信隊列綁定:隊列、交換機、路由鍵(routingKey)
        channel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");

        //正常隊列綁定死信隊列信息
        Map<String, Object> params = new HashMap<>();
        //正常隊列設(shè)置死信交換機 參數(shù) key 是固定值
        params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //正常隊列設(shè)置死信 routing-key 參數(shù) key 是固定值
        params.put("x-dead-letter-routing-key", "lisi");

        //正常隊列
        String normalQueue = "normal-queue";
        channel.queueDeclare(normalQueue, false, false, false, params);
        channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");

        System.out.println("等待接收消息........... ");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println("Consumer01 接收到消息" + message);
        };
        channel.basicConsume(normalQueue, true, deliverCallback, consumerTag -> {
        });
    }

}

生產(chǎn)者代碼

public class Producer {
    private static final String NORMAL_EXCHANGE = "normal_exchange";

    public static void main(String[] argv) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();

        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        //設(shè)置消息的 TTL 時間 10s
        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
        //該信息是用作演示隊列個數(shù)限制
        for (int i = 1; i < 11; i++) {
            String message = "info" + i;
            channel.basicPublish(NORMAL_EXCHANGE, "zhangsan", properties, message.getBytes());
            System.out.println("生產(chǎn)者發(fā)送消息:" + message);
        }

    }
}

啟動 C1 ,之后關(guān)閉消費者,模擬其接收不到消息。再啟動 Producer
【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列
消費者 C2 代碼:

以上步驟完成后,啟動 C2 消費者,它消費死信隊列里面的消息

public class Consumer02 {
    //死信交換機名稱
    private static final String DEAD_EXCHANGE = "dead_exchange";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();

        //聲明交換機
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //聲明隊列
        String deadQueue = "dead-queue";
        channel.queueDeclare(deadQueue, false, false, false, null);
        channel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");

        System.out.println("等待接收死信消息........... ");
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println("Consumer02 接收到消息" + message);
        };
        channel.basicConsume(deadQueue, true, deliverCallback, consumerTag -> {
        });
    }
}

【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列

死信之最大長度

1、消息生產(chǎn)者代碼去掉 TTL 屬性
【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列
2、C1 消費者修改以下代碼**(啟動之后關(guān)閉該消費者 模擬其接收不到消息)**
【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列

//設(shè)置正常隊列的長度限制,例如發(fā)10個,4個則為死信
params.put("x-max-length",6);

注意此時需要把原先隊列刪除 因為參數(shù)改變了

3、C2 消費者代碼不變(啟動 C2 消費者)
【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列

死信之消息被拒

1、消息生產(chǎn)者代碼同上生產(chǎn)者一致

2、C1 消費者代碼(啟動之后關(guān)閉該消費者 模擬其接收不到消息)

拒收消息 “info5”

public class Consumer01 {

    //普通交換機名稱
    private static final String NORMAL_EXCHANGE = "normal_exchange";
    //死信交換機名稱
    private static final String DEAD_EXCHANGE = "dead_exchange";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();

        //聲明死信和普通交換機 類型為 direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        //聲明死信隊列
        String deadQueue = "dead-queue";
        channel.queueDeclare(deadQueue, false, false, false, null);
        //死信隊列綁定:隊列、交換機、路由鍵(routingKey)
        channel.queueBind(deadQueue, DEAD_EXCHANGE, "lisi");
        
        //正常隊列綁定死信隊列信息
        Map<String, Object> params = new HashMap<>();
        //正常隊列設(shè)置死信交換機 參數(shù) key 是固定值
        params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //正常隊列設(shè)置死信 routing-key 參數(shù) key 是固定值
        params.put("x-dead-letter-routing-key", "lisi");
//        //設(shè)置正常隊列的長度限制,例如發(fā)10個,4個則為死信
//        params.put("x-max-length",6);
        
        //正常隊列
        String normalQueue = "normal-queue";
        channel.queueDeclare(normalQueue, false, false, false, params);
        channel.queueBind(normalQueue, NORMAL_EXCHANGE, "zhangsan");

        System.out.println("等待接收消息........... ");
        
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            if (message.equals("info5")) {
                System.out.println("Consumer01 接收到消息" + message + "并拒絕簽收該消息");
                //requeue 設(shè)置為 false 代表拒絕重新入隊 該隊列如果配置了死信交換機將發(fā)送到死信隊列中
                channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);
            } else {
                System.out.println("Consumer01 接收到消息" + message);
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            }

        };
        //開啟手動應(yīng)答
        channel.basicConsume(normalQueue, false, deliverCallback, consumerTag -> {
        });
    }

}

【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列
3、C2 消費者代碼不變

啟動消費者 1 然后再啟動消費者 2

【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列


【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列


??結(jié)語

??初學(xué)一門技術(shù)時,總有些許的疑惑,別怕,它們是我們學(xué)習(xí)路上的點點繁星,幫助我們不斷成長。

??文章粗淺,希望對大家有幫助!

??下一篇 -->【RabbitMQ教程】第四章 —— RabbitMQ - 延遲隊列文章來源地址http://www.zghlxwxcb.cn/news/detail-487167.html

到了這里,關(guān)于【RabbitMQ教程】第五章 —— RabbitMQ - 死信隊列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Rabbitmq死信隊列及延時隊列實現(xiàn)

    問題:什么是延遲隊列 我們常說的延遲隊列是指消息進(jìn)入隊列后不會被立即消費,只有達(dá)到指定時間后才能被消費。 但RabbitMq中并 沒有提供延遲隊列功能 。那么RabbitMQ如何實現(xiàn)延遲隊列 通過:死信隊列 + RabbitMQ的TTL特性實現(xiàn)。 實現(xiàn)原理 給一個普通帶有過期功能的隊列綁定一

    2024年02月15日
    瀏覽(20)
  • 【RabbitMQ筆記10】消息隊列RabbitMQ之死信隊列的介紹

    【RabbitMQ筆記10】消息隊列RabbitMQ之死信隊列的介紹

    這篇文章,主要介紹消息隊列RabbitMQ之死信隊列。 目錄 一、RabbitMQ死信隊列 1.1、什么是死信隊列 1.2、設(shè)置過期時間TTL 1.3、配置死信交換機和死信隊列(代碼配置) (1)設(shè)置隊列過期時間 (2)設(shè)置單條消息過期時間 (3)隊列設(shè)置死信交換機 (4)配置的基本思路 1.4、配置

    2024年02月16日
    瀏覽(95)
  • 【RabbitMQ學(xué)習(xí)日記】——死信隊列與延遲隊列

    【RabbitMQ學(xué)習(xí)日記】——死信隊列與延遲隊列

    死信,顧名思義就是無法被消費的消息,字面意思可以這樣理解,一般來說, producer 將消息投遞到 broker 或者直接到 queue 里了, consumer 從 queue 取出消息進(jìn)行消費,但某些時候 由于特定的原因?qū)е?queue 中的某些消息無法被消費 ,這樣的消息如果沒有后續(xù)的處理,就變成了死

    2024年02月06日
    瀏覽(22)
  • RabbitMQ——死信隊列

    死信隊列(Dead Letter Queue,DLQ)是 RabbitMQ 中的一種重要特性,用于處理無法被消費的消息,防止消息丟失。 死信的來源 在消息隊列中,當(dāng)消息滿足一定條件而無法被正常消費時,這些消息會被發(fā)送到死信隊列。滿足條件的情況包括但不限于: 消息被拒絕( basic.reject 或 bas

    2024年03月14日
    瀏覽(22)
  • RabbitMQ進(jìn)階——死信隊列

    RabbitMQ進(jìn)階——死信隊列

    在消息隊列中,執(zhí)行異步任務(wù)時,通常是將消息生產(chǎn)者發(fā)布的消息存儲在隊列中,由消費者從隊列中獲取并處理這些消息。但是,在某些情況下,消息可能無法正常地被處理和消耗,例如:格式錯誤、設(shè)備故障等,這些未成功處理的消息就被稱為“死信”。 為了避免這些未成

    2024年04月13日
    瀏覽(25)
  • RabbitMQ: 死信隊列

    RabbitMQ: 死信隊列

    其實就是一個普通的隊列,綁定號私信交換機,不給ttl,給上匹配的路由,等待交換機發(fā)送消息。 1.在消費者里的RabbitMQConfig配置類里,創(chuàng)建隊列,給它加參數(shù) 第四個參數(shù),就是放入這個隊列,的一些屬性參數(shù) 也就是這兩個位置 對應(yīng)Java代碼里好像少個參數(shù),排他性,是指,

    2024年02月09日
    瀏覽(23)
  • RabbitMQ 死信隊列實現(xiàn)

    RabbitMQ 死信隊列實現(xiàn)

    死信隊列使用注解實現(xiàn) 報錯: 可以使用注解的方式來綁定 死信隊列,但是還是會報上面的錯誤,繼續(xù)修改 參數(shù)試試 java - How to set x-dead-letter-exchange in Rabbit? - Stack Overflow 但是使用注解綁定的話好像又不生效了,問題原因,tmd將死信參數(shù)綁到交換機上了,c 修改代碼 ?至于問題

    2024年02月02日
    瀏覽(16)
  • rabbitmq的死信隊列

    rabbitmq的死信隊列

    目錄 成為死信的條件? 消息TTL過期? ?隊列達(dá)到最大長度 ?消息被拒 延遲隊列 ?延遲隊列使用場景 ?消息設(shè)置 TTL 隊列設(shè)置 TTL ?兩者區(qū)別 ? producer 將消息投遞到 broker 或者直接到 queue 里了, consumer 從 queue 取出消息 進(jìn)行消費,但某些時候由于特定的 原因?qū)е?queue 中的某些消

    2024年02月12日
    瀏覽(18)
  • rabbitMQ引入死信隊列

    rabbitMQ引入死信隊列

    ? ? ? ? 指的是,從隊列當(dāng)中取出來的消息,到達(dá)消費方后,因為某些原因?qū)е孪⒉]有被正常消費掉,這些沒有被后續(xù)處理的消息就是“死信”,而保存死信的隊列,就是死信隊列。 ? ? ? ? 為了保證訂單業(yè)務(wù)的消息數(shù)據(jù)不丟失,需要使用死信隊列機制,在消息消費發(fā)生

    2024年02月02日
    瀏覽(18)
  • RabbitMQ:死信隊列

    RabbitMQ:死信隊列

    ??個人主頁:不斷前進(jìn)的皮卡丘 ??博客描述:夢想也許遙不可及,但重要的是追夢的過程,用博客記錄自己的成長,記錄自己一步一步向上攀登的印記 ??個人專欄:消息中間件 隊列中不能被消費的消息稱為死信隊列 有時候因為特殊原因,可能導(dǎo)致隊列中的某些信息無法被消費

    2024年02月02日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包