最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RocketMQ延遲消息簡(jiǎn)明介紹

 更新時(shí)間:2022年08月22日 17:11:22   作者:π大星的日常  
這篇文章主要介紹了RocketMQ延遲消息,延遲消息是個(gè)啥?顧名思義,就是等一段時(shí)間再消費(fèi)的消息。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

場(chǎng)景可以是這樣的,雙11搶手機(jī),一個(gè)新手機(jī)4000-5000,到0點(diǎn)的時(shí)候,沖著興奮勁,搶到了。但是摸了摸錢包,又冷靜下來(lái)了,好像不是很必要換手機(jī)。就放在那里沒(méi)有支付,過(guò)了30分鐘,自動(dòng)取消了。這里就是使用延遲消息的場(chǎng)景,當(dāng)下單之后,向消息隊(duì)列發(fā)送一條延遲30分鐘消費(fèi)的消息。等到30分鐘過(guò)了,然后消費(fèi)消息,執(zhí)行檢查任務(wù),要是對(duì)應(yīng)的訂單支付了,就什么都不做,要是沒(méi)支付,就取消訂單。

RocketMQ的延遲消息是org.apache.rocketmq.broker.schedule.ScheduleMessageService類實(shí)現(xiàn)的

核心屬性

RMQ_SYS_SCHEDULE_TOPIC

在之前的版本中叫SCHEDULE_TOPIC,是系統(tǒng)內(nèi)置的Topic,用來(lái)保存所有的定時(shí)消息。沒(méi)有執(zhí)行的定時(shí)消息都會(huì)被保存在這個(gè)topic中。

FIRST_DELAY_TIME

第一次執(zhí)行定時(shí)任務(wù)的延遲時(shí)間,默認(rèn)是1秒。

private static final long FIRST_DELAY_TIME = 1000L;

DELAY_FOR_A_WHILE

第二次以及之后每次定時(shí)任務(wù)執(zhí)行的間隔時(shí)間,默認(rèn)100ms。

private static final long DELAY_FOR_A_WHILE = 100L;

DELAY_FOR_A_PERIOD

若是延遲消息投遞失敗,則在這個(gè)時(shí)間過(guò)后繼續(xù)投遞,默認(rèn)10秒。

private static final long DELAY_FOR_A_PERIOD = 10000L;

delayLevelTable

這是保存延遲級(jí)別和延遲時(shí)間映射關(guān)系的地方

private final ConcurrentMap<Integer /* level */, Long/* delay timeMillis */> delayLevelTable =
    new ConcurrentHashMap<Integer, Long>(32);

offsetTable

保存延遲級(jí)別和對(duì)應(yīng)的消費(fèi)位點(diǎn)

private final ConcurrentMap<Integer /* level */, Long/* offset */> offsetTable =
    new ConcurrentHashMap<Integer, Long>(32);

核心方法

queueId2DelayLevel

將queueId轉(zhuǎn)換為延遲級(jí)別

public static int queueId2DelayLevel(final int queueId) {
    return queueId + 1;
}

delayLevel2QueueId

將延遲級(jí)別轉(zhuǎn)換為queueId

public static int delayLevel2QueueId(final int delayLevel) {
    return delayLevel - 1;
}

updateOffset

更新延遲消息topic的消費(fèi)位點(diǎn)

private void updateOffset(int delayLevel, long offset) {
    this.offsetTable.put(delayLevel, offset);
    if (versionChangeCounter.incrementAndGet() % brokerController.getBrokerConfig().getDelayOffsetUpdateVersionStep() == 0) {
        long stateMachineVersion = brokerController.getMessageStore() != null ? brokerController.getMessageStore().getStateMachineVersion() : 0;
        dataVersion.nextVersion(stateMachineVersion);
    }
}

computeDeliverTimestamp

根據(jù)延遲消息級(jí)別和消息的存儲(chǔ)時(shí)間計(jì)算該延遲消息的投遞時(shí)間

public long computeDeliverTimestamp(final int delayLevel, final long storeTimestamp) {
    Long time = this.delayLevelTable.get(delayLevel);
    if (time != null) {
        return time + storeTimestamp;
    }
    return storeTimestamp + 1000;
}

start()

啟動(dòng)延遲消息服務(wù)

shutdown()

關(guān)閉start方法中啟動(dòng)的額timer任務(wù)

load()

加載消息的消費(fèi)位點(diǎn)信息和全部的延遲級(jí)別信息。延遲級(jí)別信息默認(rèn)如下。

private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";

parseDelayLevel

格式化所有的延遲級(jí)別信息,保存到內(nèi)存中。

到此這篇關(guān)于RocketMQ延遲消息簡(jiǎn)明介紹的文章就介紹到這了,更多相關(guān)RocketMQ延遲消息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 三種簡(jiǎn)單排序算法(使用java實(shí)現(xiàn))

    三種簡(jiǎn)單排序算法(使用java實(shí)現(xiàn))

    下面小編就為大家?guī)?lái)一篇三種簡(jiǎn)單排序算法(使用java實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn)

    Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn)

    Java中使用Unsafe實(shí)例化對(duì)象是一項(xiàng)十分有趣而且強(qiáng)大的功能,本文主要介紹了Java?Unsafe創(chuàng)建對(duì)象的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 舉例講解Java中final關(guān)鍵字的用法

    舉例講解Java中final關(guān)鍵字的用法

    Java中的final關(guān)鍵字可以被用來(lái)修飾變量、方法和類等,意味著終結(jié)、不可改變,下面我們就來(lái)舉例講解Java中final關(guān)鍵字的用法:
    2016-06-06
  • 比較Java數(shù)組和各種List的性能小結(jié)

    比較Java數(shù)組和各種List的性能小結(jié)

    這篇文章主要是分別對(duì)Java數(shù)組、ArrayList、LinkedList和Vector進(jìn)行隨機(jī)訪問(wèn)和迭代等操作,并比較這種集合的性能。有需要的可以參考借鑒。
    2016-08-08
  • Struts2實(shí)現(xiàn)多文件上傳功能

    Struts2實(shí)現(xiàn)多文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)多文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 利用MyBatis實(shí)現(xiàn)條件查詢的方法匯總

    利用MyBatis實(shí)現(xiàn)條件查詢的方法匯總

    這篇文章主要給大家介紹了關(guān)于利用MyBatis實(shí)現(xiàn)條件查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java中char[]輸出不是內(nèi)存地址的原因詳解

    Java中char[]輸出不是內(nèi)存地址的原因詳解

    這篇文章主要介紹了關(guān)于Java中char[]輸出為什么不是內(nèi)存地址的原因,文中通過(guò)示例代碼介紹的很詳細(xì),需要的朋友們可以參考學(xué)習(xí)。
    2017-03-03
  • Java中的注解機(jī)制Annotation詳解

    Java中的注解機(jī)制Annotation詳解

    這篇文章主要介紹了Java中的注解機(jī)制Annotation詳解,  Java Annotation 是 Java 語(yǔ)言中的一種 元數(shù)據(jù)機(jī)制,它可以在代碼中添加額外的信息,以便于程序的理解和處理,Annotation 可以用來(lái)描述類、方法、屬性等各種程序的特性,需要的朋友可以參考下
    2023-10-10
  • 淺談mybatis中SQL語(yǔ)句給boolean類型賦值問(wèn)題

    淺談mybatis中SQL語(yǔ)句給boolean類型賦值問(wèn)題

    這篇文章主要介紹了淺談mybatis中SQL語(yǔ)句給boolean類型賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 深入了解Java線程池的原理和監(jiān)控

    深入了解Java線程池的原理和監(jiān)控

    這篇文章主要介紹了深入了解Java線程池的原理和監(jiān)控,創(chuàng)建Java線程需要給線程分配堆棧內(nèi)存以及初始化內(nèi)存,還需要進(jìn)行系統(tǒng)調(diào)用,頻繁地創(chuàng)建和銷毀線程會(huì)大大降低系統(tǒng)的運(yùn)行效率,這時(shí)候就要用到線程池,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

宣恩县| 洞头县| 梧州市| 瑞金市| 彭阳县| 高雄县| 嘉义县| 鄂伦春自治旗| 新昌县| 理塘县| 绥德县| 景宁| 南涧| 元朗区| 徐州市| 塔城市| 资阳市| 东莞市| 来宾市| 苏尼特右旗| 金门县| 泸水县| 南靖县| 仁布县| 乐业县| 高邑县| 涟水县| 汉寿县| 清水河县| 平湖市| 化隆| 霞浦县| 宁南县| 无极县| 太谷县| 新田县| 静宁县| 德化县| 大冶市| 岳西县| 囊谦县|