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

SpringBoot整合RocketMq實現(xiàn)分布式事務(wù)

 更新時間:2024年11月06日 10:33:39   作者:我是小趴菜  
這篇文章主要為大家詳細介紹了SpringBoot整合RocketMq實現(xiàn)分布式事務(wù)的相關(guān)知識,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下

大家好,今天我們繼續(xù)分布式事務(wù)的學(xué)習(xí),之前我們已經(jīng)實戰(zhàn)了

springboot整合Atomikos

springboot整合Himly 

來實現(xiàn)分布式事務(wù),今天我們繼續(xù)學(xué)習(xí)springboot整合RocketMq來實現(xiàn)分布式事務(wù)

MQ實現(xiàn)分布式事務(wù)原理

RocketMq提供了事務(wù)消息,要實現(xiàn)分布式事務(wù)主要還是利用它的事務(wù)消息

  • 1:服務(wù)A首先會發(fā)送一條半事務(wù)的消息到MQ,此時服務(wù)接收方還是無法消費這條消息的
  • 2:半事務(wù)消息發(fā)送成功之后,服務(wù)A開始執(zhí)行本地業(yè)務(wù)邏輯
  • 3:服務(wù)A執(zhí)行完本地業(yè)務(wù)之后,提交事務(wù),事務(wù)提交成功之后,MQ這條半事務(wù)消息就會變成原始可消費的消息
  • 4:服務(wù)接收方這時候就可以消費到這條消息,繼續(xù)執(zhí)行后續(xù)業(yè)務(wù)了

那么在這整個過程中可能會出現(xiàn)的異常有哪些呢?

1:半事務(wù)消息發(fā)送失敗

如果半事務(wù)消息發(fā)送失敗,那么服務(wù)A就不會繼續(xù)執(zhí)行接下來的業(yè)務(wù)了,整個流程會直接退出

2:本地事務(wù)提交成功,發(fā)送COMMIT消息失敗

服務(wù)A事務(wù)提交之后,需要發(fā)送一條消息告訴MQ,這條半事務(wù)消息可以消費了,但是這時候,COMMIT消息發(fā)送失敗了,那么這條消息就還是處于半事務(wù)狀態(tài),所以MQ會進行回查

回查服務(wù)A這個事務(wù)是否成功了,如果成功了,就會發(fā)送回查結(jié)果,如果本地事務(wù)成功了,那么回查就會發(fā)送COMMIT消息,這條消息重新設(shè)置為可消費狀態(tài)

實戰(zhàn)

服務(wù)-A

@Transactional(rollbackFor = Exception.class)
@Override
public String mqInsert(Test test) {

    //本地服務(wù)調(diào)用
    testDao.insert(test);

    //發(fā)送半事務(wù)消息
    //Test是我們本地需要保存的一個對象
    Message<String> message = MessageBuilder.withPayload(JSONObject.toJSONString(test)).build();
    rocketMQTemplate.sendMessageInTransaction("test-topic", message, null);

    return "success";
}
@RocketMQTransactionListener
public class TransactionMqListener implements RocketMQLocalTransactionListener {

    @Resource
    private TestDao testDao;

    //執(zhí)行本地事務(wù)
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {
        //獲取半事務(wù)消息
        Test test = JSONObject.parseObject(new String((byte[]) message.getPayload()), Test.class);
        System.out.println("test | executeLocalTransaction | 消息是:" + JSONObject.toJSONString(test));
        
        //根據(jù)id查詢該記錄是否保存成功了
        Test testExist = testDao.queryById(test.getId());
        if(testExist == null) {
            //說明本地事務(wù)提交失敗了,需要回滾
            return RocketMQLocalTransactionState.ROLLBACK;
        }
        
        //本地事務(wù)提交成功
        return RocketMQLocalTransactionState.COMMIT;
    }

    //事務(wù)回查
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message message) {
        Test test = JSONObject.parseObject(new String((byte[]) message.getPayload()), Test.class);
        System.out.println("test | checkLocalTransaction | 消息是:" + JSONObject.toJSONString(test));
        
        //還是根據(jù)id去查詢記錄
        Test testExist = testDao.queryById(test.getId());
        if(testExist == null) {
            //不存在,說明本地事務(wù)提交失敗,回滾
            return RocketMQLocalTransactionState.ROLLBACK;
        }
        
        //本地事務(wù)提交成功了
        return RocketMQLocalTransactionState.COMMIT;
    }
}

服務(wù)B

@Component
@RocketMQMessageListener(topic = "test-topic",consumerGroup = "cpy-consumer-group")
public class CpyListener implements RocketMQListener<String> {


    //消息監(jiān)聽
    @Override
    public void onMessage(String s) {
        System.out.println("cpy服務(wù)收到消息:" + JSONObject.toJSONString(s));
    }
}

測試

我們先把這里的狀態(tài)改成 UNKNOWN,來模擬本地事務(wù)提交失敗的場景,來驗證事務(wù)回查的效果

發(fā)送事務(wù)消息之后,我們這里是UNKNOWN狀態(tài),所以沒有提交成功

此時服務(wù)-B也沒有消費到消息

過了一會,MQ事務(wù)消息進行回查,此時因為數(shù)據(jù)庫已經(jīng)存在這條記錄了,所以直接COMMIT

這時候服務(wù)消費方也成功消費到消息了

到此這篇關(guān)于SpringBoot整合RocketMq實現(xiàn)分布式事務(wù)的文章就介紹到這了,更多相關(guān)SpringBoot RocketMq分布式事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用正則表達式進行匹配且對匹配結(jié)果逐個替換

    Java使用正則表達式進行匹配且對匹配結(jié)果逐個替換

    這篇文章主要介紹了Java使用正則表達式進行匹配且對匹配結(jié)果逐個替換,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 使用feign傳遞參數(shù)類型為MultipartFile的問題

    使用feign傳遞參數(shù)類型為MultipartFile的問題

    這篇文章主要介紹了使用feign傳遞參數(shù)類型為MultipartFile的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot實現(xiàn)MQTT消息發(fā)送和接收方式

    SpringBoot實現(xiàn)MQTT消息發(fā)送和接收方式

    這篇文章主要介紹了SpringBoot實現(xiàn)MQTT消息發(fā)送和接收方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java 中的語法糖,真甜

    Java 中的語法糖,真甜

    語法糖(Syntactic sugar),也叫做糖衣語法,是英國科學(xué)家發(fā)明的一個術(shù)語,通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會.這篇文章主要介紹了Java 中的語法糖知識,需要的朋友可以參考下
    2020-12-12
  • 詳解SpringBoot中異步請求和異步調(diào)用(看完這一篇就夠了)

    詳解SpringBoot中異步請求和異步調(diào)用(看完這一篇就夠了)

    這篇文章主要介紹了SpringBoot中異步請求和異步調(diào)用問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Mybatis?MappedStatement類核心原理詳解

    Mybatis?MappedStatement類核心原理詳解

    這篇文章主要介紹了Mybatis?MappedStatement類,mybatis的mapper文件最終會被解析器,解析成MappedStatement,其中insert|update|delete|select每一個標(biāo)簽分別對應(yīng)一個MappedStatement
    2022-11-11
  • Java基礎(chǔ)MAC系統(tǒng)下IDEA連接MYSQL數(shù)據(jù)庫JDBC過程

    Java基礎(chǔ)MAC系統(tǒng)下IDEA連接MYSQL數(shù)據(jù)庫JDBC過程

    最近一直在學(xué)習(xí)web項目,當(dāng)然也會涉及與數(shù)據(jù)庫的連接這塊,這里就總結(jié)一下在IDEA中如何進行MySQL數(shù)據(jù)庫的連接,這里提一下我的電腦是MAC系統(tǒng),使用的編碼軟件是IDEA,數(shù)據(jù)庫是MySQL
    2021-09-09
  • 你所不知道的Spring的@Autowired實現(xiàn)細節(jié)分析

    你所不知道的Spring的@Autowired實現(xiàn)細節(jié)分析

    這篇文章主要介紹了你所不知道的Spring的@Autowired實現(xiàn)細節(jié)分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring?Boot整合Bootstrap的超詳細步驟

    Spring?Boot整合Bootstrap的超詳細步驟

    之前做前端開發(fā),在使用bootstrap的時候都是去官網(wǎng)下載,然后放到項目中,在頁面引用,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot整合Bootstrap的超詳細步驟,需要的朋友可以參考下
    2023-05-05
  • spring BeanProcessor接口詳解

    spring BeanProcessor接口詳解

    這篇文章主要介紹了spring BeanProcessor接口的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用spring,感興趣的朋友可以了解下
    2021-03-03

最新評論

迁西县| 朝阳市| 敖汉旗| 江山市| 民县| 竹溪县| 巴东县| 清远市| 泰和县| 曲阳县| 凯里市| 黎川县| 漾濞| 南江县| 呼和浩特市| 乌兰察布市| 阿拉善右旗| 五峰| 类乌齐县| 关岭| 遂昌县| 沙田区| 新巴尔虎右旗| 兰坪| 三明市| 安阳市| 葫芦岛市| 章丘市| 叙永县| 阿瓦提县| 乌拉特前旗| 美姑县| 叙永县| 长沙市| 三亚市| 岳阳市| 蓝山县| 太和县| 顺昌县| 蒙城县| 镶黄旗|