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

RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)

這篇具有很好參考價(jià)值的文章主要介紹了RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

RabbitMQ–基礎(chǔ)–8.1–消息確認(rèn)機(jī)制–接受確認(rèn)機(jī)制(ACK)


代碼位置

https://gitee.com/DanShenGuiZu/learnDemo/tree/master/rabbitMq-learn/rabbitMq-03

1、場(chǎng)景和問(wèn)題

1.1、需求

消費(fèi)者收到Queue中的消息,但沒(méi)有處理完成就宕機(jī)的情況,這種情況下就可能會(huì)導(dǎo)致消息丟失。

為了避免這種情況發(fā)生,我們可以要求消費(fèi)者在消費(fèi)完消息后發(fā)送一個(gè)回執(zhí)給RabbitMQ,RabbitMQ收到消息回執(zhí)(Message acknowledgment)后才將該消息從Queue中移除。

如果RabbitMQ沒(méi)有收到回執(zhí)并檢測(cè)到消費(fèi)者的RabbitMQ連接斷開(kāi),則RabbitMQ會(huì)將該消息發(fā)送給其他消費(fèi)者(如果存在多個(gè)消費(fèi)者)進(jìn)行處理。

這里不存在Timeout概念,一個(gè)消費(fèi)者處理消息時(shí)間再長(zhǎng)也不會(huì)導(dǎo)致該消息被發(fā)送給其他消費(fèi)者,除非它的RabbitMQ連接斷開(kāi)。

1.2、消息確認(rèn)消息引發(fā)的問(wèn)題

如果我們的開(kāi)發(fā)人員在處理完業(yè)務(wù)邏輯后,忘記發(fā)送回執(zhí)給RabbitMQ,這將會(huì)導(dǎo)致嚴(yán)重的問(wèn)題,Queue中堆積的消息會(huì)越來(lái)越多,消費(fèi)者重啟后會(huì)重復(fù)消費(fèi)這些消息并重復(fù)執(zhí)行業(yè)務(wù)邏輯。

2、channel.basicConsume(queueName,autoAck,callback)方法

RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)

2.1、參數(shù)

  1. queueName:隊(duì)列名稱
  2. autoAck:設(shè)置是否自動(dòng)確認(rèn)
    1. true:自動(dòng)確認(rèn),消息一旦被消費(fèi)者接收,隊(duì)列中的消息就會(huì)被刪除
    2. false:手動(dòng)確認(rèn)
  3. callback:設(shè)置消費(fèi)者的回調(diào)函數(shù),用來(lái)處理 RabbitMQ 推送過(guò)來(lái)的消息

3、消息確認(rèn)機(jī)制 ACK

  1. 為了保證消息從隊(duì)列可靠地達(dá)到消費(fèi)者
  2. 當(dāng)消費(fèi)者獲取消息后,會(huì)向 RabbitMQ 發(fā)送回執(zhí) ACK,告知消息已經(jīng)被接收。
  3. ACK分兩種情況
    1. 自動(dòng) ACK
    2. 手動(dòng) ACK

3.1、自動(dòng) ACK

  1. autoAck=false。
  2. RabbitMQ 會(huì)自動(dòng)把發(fā)送出去的消息設(shè)置為確認(rèn),然后從內(nèi)存或磁盤中刪除,而不管消費(fèi)者是否真正地消費(fèi)了這些消息

3.2、手動(dòng) ACK

  1. autoAck=false。
  2. RabbitMQ 會(huì)等待消費(fèi)者顯示地回復(fù)確認(rèn)信號(hào)后才從內(nèi)存或磁盤中移去消息

3.2.1、好處

  1. autoAck=false,消費(fèi)者就有足夠的時(shí)間處理消息,不用擔(dān)心處理消息過(guò)程中,消費(fèi)者進(jìn)程掛掉后消息丟失的問(wèn)題。因?yàn)椋琑abbitMQ 會(huì)一直等待持有消息,直到消費(fèi)者顯示調(diào)用 Basic.Ack 命令為止。

3.2.2、原理

  1. autoAck=false,隊(duì)列中的消息分成了兩部分
    1. 等待投遞給消費(fèi)者的消息
    2. 已經(jīng)投遞給消費(fèi)者,但還沒(méi)有收到消費(fèi)者確認(rèn)信號(hào)的消息。
  2. 如果RabbitMQ一直沒(méi)有收到消費(fèi)者的確認(rèn)信號(hào),并且消費(fèi)此消息的消費(fèi)者已經(jīng)斷開(kāi)連接,則RabbitMQ會(huì)安排該消息重新進(jìn)入隊(duì)列,等待投遞給下一個(gè)消費(fèi)者。這樣就保證消息不丟失了。

3.3、使用場(chǎng)景

  1. 如果消息不太重要,丟失也沒(méi)有影響,那么autoAck=ture。
  2. 如果消息非常重要,不容丟失,那么autoAck=ture。

4、代碼實(shí)現(xiàn)(手動(dòng) ACK)

4.1、代碼結(jié)構(gòu)

RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)

4.2、生產(chǎn)者


package com.example.rabbitmq03.business.test7;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class Producer {
    // 簡(jiǎn)單模式
    public static void main(String[] args) {
        // 1. 獲取連接
        Connection connection = null;
        try {
            connection = RabbitMqUtil.getConnection("生產(chǎn)者");
        } catch (Exception e) {
            System.out.println("獲取連接時(shí),出現(xiàn)異常");
        }
        
        Channel channel = null;
        try {
            // 2. 通過(guò)連接獲取通道 Channel
            channel = connection.createChannel();
            String queueName = "code_simple_queue1";
            // 3. 通過(guò)通道創(chuàng)建聲明隊(duì)列
            channel.queueDeclare(queueName, false, false, false, null);
            // 4. 準(zhǔn)備消息內(nèi)容
            String message = "你好";
            // 5. 發(fā)送消息給隊(duì)列 Queue
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println("消息發(fā)送完成~~~發(fā)送的消息為:" + message);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                RabbitMqUtil.close(connection, channel);
            } catch (Exception e) {
                System.out.println("關(guān)閉時(shí),出現(xiàn)異常");
            }
        }
    }
}

4.3、消費(fèi)者

修改的地方
RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)


package com.example.rabbitmq03.business.test7;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import com.rabbitmq.client.*;
public class Consumer {

    public static void main(String[] args) throws Exception{
        // 獲取連接
        Connection connection = RabbitMqUtil.getConnection("消費(fèi)者");

        final Channel channel = connection.createChannel();
        String queueName = "code_simple_queue1";

        // 定義消費(fèi)者
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 消息id,mq 在 channel 中用來(lái)標(biāo)識(shí)消息的 id,可用于確認(rèn)消息已接收
                long deliveryTag = envelope.getDeliveryTag();
                // body 消息體
                String msg = new String(body,"utf-8");
                System.out.println("收到消息:" + msg);
                /**
                 * @param1:deliveryTag:用來(lái)標(biāo)識(shí)消息的id
                 * @param2:multiple:是否批量。true:將一次性 ACK 所有小于 deliveryTag 的消息
                 */
                // 手動(dòng)確認(rèn)
                channel.basicAck(deliveryTag, false);
            }
        };

        // 監(jiān)聽(tīng)隊(duì)列  手動(dòng) ACK
        channel.basicConsume(queueName, false, consumer);

        System.out.println("開(kāi)始接收消息~~~");
        System.in.read();

        // 關(guān)閉信道、連接
        RabbitMqUtil.close(connection, channel);
    }
}

4.4、測(cè)試

RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)
RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)

5、自動(dòng) ACK 帶來(lái)的問(wèn)題

5.1、執(zhí)行生產(chǎn)者,產(chǎn)生一條記錄

RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)

5.2、設(shè)置修改消費(fèi)者為自動(dòng)ACK

package com.example.rabbitmq03.business.test7;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import com.rabbitmq.client.*;

public class Consumer {
    
    public static void main(String[] args) throws Exception {
        // 獲取連接
        Connection connection = RabbitMqUtil.getConnection("消費(fèi)者");
        
        final Channel channel = connection.createChannel();
        String queueName = "code_simple_queue1";
        
        // 定義消費(fèi)者
        com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                    byte[] body) throws IOException {
                int result = 1 / 0;
                // body 消息體
                String msg = new String(body, "utf-8");
                System.out.println("收到消息:" + msg);
                
            }
        };
        // 監(jiān)聽(tīng)隊(duì)列 自動(dòng) ACK
        channel.basicConsume(queueName, true, consumer);
        
        System.out.println("開(kāi)始接收消息~~~");
        System.in.read();
        
        // 關(guān)閉信道、連接
        RabbitMqUtil.close(connection, channel);
    }
}

5.3、執(zhí)行消費(fèi)者

RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)
RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)

消費(fèi)者代碼報(bào)錯(cuò),沒(méi)有收到消息,但是隊(duì)列的消息少了,原因就是,MQ將異常內(nèi)部消化了。
RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-499046.html

到了這里,關(guān)于RabbitMQ--基礎(chǔ)--8.1--消息確認(rèn)機(jī)制--接受確認(rèn)機(jī)制(ACK)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SpringBoot-RabbitMQ06-持久化和ACK確認(rèn)機(jī)制

    SpringBoot-RabbitMQ06-持久化和ACK確認(rèn)機(jī)制

    1.什么是消息確認(rèn)ACK? 如果在處理消息的過(guò)程中,消費(fèi)者的服務(wù)器在處理消息時(shí)出現(xiàn)異常,那么可能這條正在處理的消息劉沒(méi)有完成消息消費(fèi),數(shù)據(jù)就會(huì)丟失,為了確保數(shù)據(jù)不會(huì)丟失RabbitMQ支持消息確認(rèn)-ACK 2.ACK的消息確認(rèn)機(jī)制 ACK機(jī)制是消費(fèi)者從RabbitMQ收到消息并處理完成后,反

    2024年04月15日
    瀏覽(20)
  • springboot整合rabbitmq的發(fā)布確認(rèn),消費(fèi)者手動(dòng)返回ack,設(shè)置備用隊(duì)列,以及面試題:rabbitmq確保消息不丟失

    springboot整合rabbitmq的發(fā)布確認(rèn),消費(fèi)者手動(dòng)返回ack,設(shè)置備用隊(duì)列,以及面試題:rabbitmq確保消息不丟失

    目錄 1.生產(chǎn)者發(fā)消息到交換機(jī)時(shí)候的消息確認(rèn) 2.交換機(jī)給隊(duì)列發(fā)消息時(shí)候的消息確認(rèn) 3.備用隊(duì)列 3.消費(fèi)者手動(dòng)ack ? rabbitmq的發(fā)布確認(rèn)方式,可以有效的保證我們的數(shù)據(jù)不丟失。 ? 消息正常發(fā)送的流程是:生產(chǎn)者發(fā)送消息到交換機(jī),然后交換機(jī)通過(guò)路由鍵把消息發(fā)送給對(duì)應(yīng)的隊(duì)

    2024年02月09日
    瀏覽(28)
  • RabbitMQ 消息確認(rèn)機(jī)制

    為了保證消息從隊(duì)列可靠的到達(dá)消費(fèi)者,RabbitMQ 提供了消息確認(rèn)機(jī)制(Message Acknowledgement)。消費(fèi)者在訂閱隊(duì)列時(shí),可以指定 autoAck 參數(shù),當(dāng) autoAck 參數(shù)等于 false 時(shí),RabbitMQ 會(huì)等待消費(fèi)者顯式地回復(fù)確認(rèn)信號(hào)后才從內(nèi)存(或者磁盤)中移除消息(實(shí)際上是先打上刪除標(biāo)記,之

    2024年02月15日
    瀏覽(23)
  • RabbitMq 消息確認(rèn)機(jī)制詳解

    RabbitMq 消息確認(rèn)機(jī)制詳解

    目錄 1.消息可靠性 1.1.生產(chǎn)者消息確認(rèn) 1.1.1.修改配置 1.1.2.定義Return回調(diào) 1.1.3.定義ConfirmCallback 1.2.消息持久化 1.2.1.交換機(jī)持久化 1.2.2.隊(duì)列持久化 1.2.3.消息持久化 1.3.消費(fèi)者消息確認(rèn) 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消費(fèi)失敗重試機(jī)制 1.4.1.本地重試 1.4.2.失敗策略 1.5.總結(jié)

    2024年01月21日
    瀏覽(17)
  • rabbitmq消息確認(rèn)機(jī)制

    rabbitmq消息確認(rèn)機(jī)制

    (1) publish === broker 只要broker收到消息,就會(huì)執(zhí)行 confirmCallback (2) exchange === queue 如果exchange有消息沒(méi)有成功發(fā)送至queue,就會(huì)執(zhí)行RuturnCallback,例:routing key錯(cuò)誤導(dǎo)致發(fā)送消息到隊(duì)列失敗 (3)RabbitmqConfig (1) queue === consumer 默認(rèn)是ack,consumer只要拿到消息就會(huì)自動(dòng)確認(rèn),服務(wù)端

    2024年02月13日
    瀏覽(20)
  • 8. springboot + rabbitmq 消息發(fā)布確認(rèn)機(jī)制

    8. springboot + rabbitmq 消息發(fā)布確認(rèn)機(jī)制

    在 RabbitMQ之生產(chǎn)者發(fā)布確認(rèn)原理章節(jié)已經(jīng)介紹了rabbitmq生產(chǎn)者是如何對(duì)消息進(jìn)行發(fā)布確認(rèn)保證消息不丟失的。本章節(jié)繼續(xù)看下springboot整合rabbitmq后是如何保證消息不丟失的。 消息正常是通過(guò)生產(chǎn)者生產(chǎn)消息傳遞到交換機(jī),然后經(jīng)過(guò)交換機(jī)路由到消息隊(duì)列中,最后消費(fèi)者消費(fèi),

    2023年04月25日
    瀏覽(21)
  • Rabbitmq入門與應(yīng)用(六)-rabbitmq的消息確認(rèn)機(jī)制

    Rabbitmq入門與應(yīng)用(六)-rabbitmq的消息確認(rèn)機(jī)制

    確認(rèn)消息是否發(fā)送給交換機(jī) 配置 編碼RabbitTemplate.ConfirmCallback ConfirmCallback 是一個(gè)回調(diào)接口,消息發(fā)送到 Broker 后觸發(fā)回調(diào),確認(rèn)消息是否到達(dá) Broker 服務(wù)器, 也就是只確認(rèn)是否正確到達(dá) Exchange 中。 在配置類中編碼確認(rèn)回調(diào)函數(shù)。tips: 設(shè)置 rabbitTemplate.setMandatory(true); 配置類

    2024年02月20日
    瀏覽(15)
  • RabbitMQ的幾種消息確認(rèn)機(jī)制詳細(xì)介紹

    RabbitMQ的幾種消息確認(rèn)機(jī)制詳細(xì)介紹

    前言:大家好,我是小威,24屆畢業(yè)生,在一家滿意的公司實(shí)習(xí)。本篇文章將詳細(xì)介紹RabbitMQ的幾種消息確認(rèn)機(jī)制。 如果文章有什么需要改進(jìn)的地方還請(qǐng)大佬不吝賜教 ????。 小威在此先感謝各位大佬啦~~???? ??個(gè)人主頁(yè):小威要向諸佬學(xué)習(xí)呀 ??個(gè)人簡(jiǎn)介:大家好,我是

    2023年04月25日
    瀏覽(21)
  • 「RabbitMQ」實(shí)現(xiàn)消息確認(rèn)機(jī)制以確保消息的可靠發(fā)送、接收和拒收

    「RabbitMQ」實(shí)現(xiàn)消息確認(rèn)機(jī)制以確保消息的可靠發(fā)送、接收和拒收

    目錄 介紹 方案 配置手動(dòng)確認(rèn) 使用 「Bean?」 配置RabbitMQ的屬性 確定消費(fèi)、拒絕消費(fèi)、拒絕消費(fèi)進(jìn)入死信隊(duì)列 模擬生產(chǎn)者發(fā)送消息① ????????RabbitMQ 的消息確認(rèn)機(jī)制應(yīng)用場(chǎng)景非常廣泛,尤其是在需要確保消息可靠性和避免消息丟失的場(chǎng)合下更為重要,例如:金融系統(tǒng)、電

    2024年02月08日
    瀏覽(51)
  • RabbitMQ:第一章:6 種工作模式以及消息確認(rèn)機(jī)制

    RabbitMQ:第一章:6 種工作模式以及消息確認(rèn)機(jī)制

    } System.out.println(“發(fā)送數(shù)據(jù)成功”); channel.close(); connection.close(); } } 消費(fèi)者一: import com.liao.rabbitmq.utils.RabbitConstant; import com.liao.rabbitmq.utils.RabbitUtils; import com.rabbitmq.client.*; import java.io.IOException; /** 消費(fèi)者1 */ public class ConsumerOne { public static void main(String[] args) throws Exception { Con

    2024年04月12日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包