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

關(guān)于RocketMQ使用事務(wù)消息

 更新時(shí)間:2023年05月08日 09:23:35   作者:樂觀男孩  
RocketMQ是一種提供消息隊(duì)列服務(wù)的中間件,也稱為消息中間件,是一套提供了消息生產(chǎn)、存儲(chǔ)、消費(fèi)全過程API的軟件系統(tǒng)。消息即數(shù)據(jù)。一般消息的體量不會(huì)很大,需要的朋友可以參考下

說明

事務(wù)消息:

1、不支持延時(shí)消息和批量消息
2、如果消息沒有及時(shí)提交,默認(rèn)check 15次,可以通過Broker的transactionCheckMax參數(shù)配置次數(shù)。如果超時(shí)15次依然沒有得到明確結(jié)果,將會(huì)打印異常信息,具體的處理策略可以通過復(fù)寫AbstractTransactionCheckListener類實(shí)現(xiàn)
3、每次check的時(shí)間間隔可以通過Broker的transactionTimeout配置,也可以在消息中增加CHECK_IMMUNITY_TIME_IN_SECONDS屬性指定
4、事務(wù)狀態(tài):LocalTransactionState.COMMIT_MESSAGE、LocalTransactionState.ROLLBACK_MESSAGE、LocalTransactionState.UNKNOW。

原理

事務(wù)消息是RocketMQ的一大特性,其保證發(fā)送消息和執(zhí)行本地邏輯在同一個(gè)事務(wù)內(nèi)。實(shí)現(xiàn)的思路借鑒了兩階段提交協(xié)議:

第一階段:發(fā)送半事務(wù)消息,消息發(fā)送后,消息是對(duì)消費(fèi)者透明的,也就是該消息還不屬于可消費(fèi)消息,消費(fèi)者無法消費(fèi)。

第二階段:執(zhí)行本地事務(wù),本地執(zhí)行事務(wù)后提交消息。

(1)、如果事務(wù)執(zhí)行失敗,則回滾消息;
(2)、如果事務(wù)執(zhí)行成功,則提交消息,提交后消費(fèi)者可消費(fèi)到消息;
(3)、如果事務(wù)執(zhí)行成功,但消息提交失敗,RocketMQ還提供了回查機(jī)制:如果一段時(shí)間過后,沒有提交/回滾半事務(wù)消息,RocketMQ會(huì)定時(shí)回查一定的次數(shù),獲取本地事務(wù)的狀態(tài)以決定是提交還是回滾消息。

如果回查一定的次數(shù)后依然沒有獲取到本地事務(wù)的明確狀態(tài),則消息會(huì)被放到死信隊(duì)列,由人工確認(rèn)如何處理。

事務(wù)消息處理流程

在這里插入圖片描述

1、生產(chǎn)端發(fā)送半事務(wù)消息到服務(wù)端
2、服務(wù)端返回半事務(wù)消息發(fā)送成功響應(yīng)。注意,此時(shí)的消息對(duì)消費(fèi)端是不可見的,不可被消費(fèi)
3、發(fā)送方執(zhí)行本地事務(wù)
4、執(zhí)行完本地事務(wù)后,客戶端同步服務(wù)端提交/回滾消息
5、如果服務(wù)端在一定的時(shí)間內(nèi),等不到4的回應(yīng),則定時(shí)進(jìn)行回查,詢問客戶端的本地事務(wù)狀態(tài)。
6、客戶端檢查本地事務(wù)狀態(tài)
7、根據(jù)本地事務(wù)執(zhí)行情況,告知服務(wù)端,服務(wù)端決定是提交消息還是丟棄消息。

生產(chǎn)端

@Test
    public void sendMessage() throws Exception {
        //事務(wù)生產(chǎn)者
        TransactionMQProducer producer = new TransactionMQProducer("defaultGroup");
        producer.setNamesrvAddr(SpringUtil.getBean(RocketMqConfig.class).getNamesrvAddr());
        //設(shè)置檢查本地事務(wù)狀態(tài)的線程池
        //producer.setExecutorService(null);
        //本地事務(wù)執(zhí)行監(jiān)聽器
        TransactionListener transactionListener = new TransactionListenerImpl();
        producer.setTransactionListener(transactionListener);
        producer.start();
        Message message = new Message(RocketMqUtil.TOPIC, "transaction", "transaction-message".getBytes(Charset.forName("UTF-8")));
        //發(fā)送事務(wù)消息
        producer.sendMessageInTransaction(message, null);
    }
    class TransactionListenerImpl implements TransactionListener {
        @Override
        public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
            //執(zhí)行本地事務(wù)(數(shù)據(jù)庫)操作......
            int num = new Random().nextInt(10);
            if (num < 3) {
                //本地事務(wù)執(zhí)行成功,提交消息
                return LocalTransactionState.COMMIT_MESSAGE;
            } else if (num < 6) {
                //本地事務(wù)執(zhí)行失敗,刪除消息
                return LocalTransactionState.ROLLBACK_MESSAGE;
            }
            //等待本地事務(wù)check,即執(zhí)行checkLocalTransaction()方法
            return LocalTransactionState.UNKNOW;
        }
        /**
         * 回查邏輯
         * @param msg
         * @return
         */
        @Override
        public LocalTransactionState checkLocalTransaction(MessageExt msg) {
            int num = new Random().nextInt(10);
            if (num < 3) {
                //提交消息
                return LocalTransactionState.COMMIT_MESSAGE;
            } else if (num < 6) {
                //刪除消息
                return LocalTransactionState.ROLLBACK_MESSAGE;
            }
            return LocalTransactionState.UNKNOW;
        }
    }

發(fā)送事務(wù)消息步驟:

1、初始化TransactionMQProducer實(shí)例
2、指定check線程池(回查線程池)
3、為Producer添加自定義事務(wù)監(jiān)聽器。自定義事務(wù)監(jiān)聽器需實(shí)現(xiàn)TransactionListener接口,通過覆蓋接口的executeLocalTransaction方法執(zhí)行本地事務(wù),返回事務(wù)狀態(tài),客戶端會(huì)根據(jù)本地事務(wù)狀態(tài)通知服務(wù)端,決定是否提交消息;通過覆蓋接口的checkLocalTransaction方法提供回查機(jī)制,當(dāng)在一定的時(shí)間內(nèi)服務(wù)端獲取不到本地事務(wù)執(zhí)行狀態(tài),將通過該方法回查事務(wù)狀態(tài),以決定消失是否需要提交。
4、通過Producer.sendMessageInTransaction發(fā)送事務(wù)消息。

消費(fèi)者正常消費(fèi)邏輯

消費(fèi)端

@Test
    public void consumeMessage() throws Exception {
        DefaultMQPushConsumer defaultMQPushConsumer = RocketMqUtil.getDefaultMQPushConsumer();
        defaultMQPushConsumer.subscribe(RocketMqUtil.TOPIC, "*");
        defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list,
                                                            ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                log.info("消費(fèi)到消息條數(shù):{}", list.size());
                list.stream().map(messageExt -> new String(messageExt.getBody(), Charset.forName("UTF-8")))
                        .map(String::new).forEach(System.out::println);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        defaultMQPushConsumer.start();
        Thread.sleep(5000L);
    }

消費(fèi)端正常消費(fèi)消息即可。

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

相關(guān)文章

  • JDK1.8安裝與配置超詳細(xì)教程

    JDK1.8安裝與配置超詳細(xì)教程

    JDK1.8即為JDK8,JDK8是目前是最成熟最穩(wěn)定的版本,本文將詳細(xì)介紹JDK1.8的安裝與配置,需要的朋友可以參考下
    2023-03-03
  • Java獲取當(dāng)?shù)氐娜粘鋈章鋾r(shí)間代碼分享

    Java獲取當(dāng)?shù)氐娜粘鋈章鋾r(shí)間代碼分享

    這篇文章主要介紹了Java獲取當(dāng)?shù)氐娜粘鋈章鋾r(shí)間代碼分享,國(guó)外猿友寫的一個(gè)類,需要的朋友可以參考下
    2014-06-06
  • SpringMVC常用注解載入與處理方式詳解

    SpringMVC常用注解載入與處理方式詳解

    這篇文章主要介紹了SpringMVC常用注解載入的方式和處理的方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 深入了解JAVA泛型

    深入了解JAVA泛型

    這篇文章主要介紹了JAVA泛型的相關(guān)知識(shí),文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 一文帶你探究Spring中Bean的線程安全性問題

    一文帶你探究Spring中Bean的線程安全性問題

    很多人都想spring中的bean是線程安全的嗎?本文將帶你探究Spring中Bean的線程安全性問題,感興趣的同學(xué)可以參考閱讀下
    2023-05-05
  • Mybatis SqlSessionFactory與SqlSession詳細(xì)講解

    Mybatis SqlSessionFactory與SqlSession詳細(xì)講解

    SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供創(chuàng)建MyBatis的核心接口SqlSession,所以我們需要先創(chuàng)建SqlSessionFactory,為此我們需要提供配置文件和相關(guān)的參數(shù)
    2022-11-11
  • JAVA各種加密與解密方式匯總

    JAVA各種加密與解密方式匯總

    在項(xiàng)目開發(fā)中,我們常需要用到加解密算法,本文主要介紹了JAVA各種加密與解密方式匯總,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • springboot集成nacos無法動(dòng)態(tài)獲取nacos配置的問題

    springboot集成nacos無法動(dòng)態(tài)獲取nacos配置的問題

    這篇文章主要介紹了springboot集成nacos無法動(dòng)態(tài)獲取nacos配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Linux下Java開發(fā)環(huán)境搭建以及第一個(gè)HelloWorld

    Linux下Java開發(fā)環(huán)境搭建以及第一個(gè)HelloWorld

    這篇文章主要介紹了Linux下Java開發(fā)環(huán)境搭建以及第一個(gè)HelloWorld的實(shí)現(xiàn)過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的領(lǐng)接矩陣詳解

    圖的領(lǐng)接矩陣存儲(chǔ)方式是用兩個(gè)數(shù)組來表示圖。一個(gè)一位數(shù)組存儲(chǔ)圖中頂點(diǎn)信息,一個(gè)二維數(shù)組存儲(chǔ)圖中的邊或弧的信息。本文將為大家重點(diǎn)介紹一下數(shù)據(jù)結(jié)構(gòu)中的圖的鄰接矩陣,快來跟隨小編一起學(xué)習(xí)吧
    2021-11-11

最新評(píng)論

怀集县| 安宁市| 洛浦县| 绍兴市| 东台市| 宝山区| 阜新市| 龙游县| 灵武市| 兴仁县| 凤凰县| 本溪| 西峡县| 九江县| 太原市| 宝清县| 大兴区| 滁州市| 阳春市| 隆子县| 永寿县| 长阳| 凌云县| 西安市| 邹城市| 沂南县| 元朗区| 务川| 儋州市| 夏邑县| 会宁县| 泽库县| 名山县| 桂林市| 当涂县| 仙居县| 隆昌县| 井冈山市| 读书| 马边| 怀化市|