欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

springboot整合Atomikos

springboot整合Himly 

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

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

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

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

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

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

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

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

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

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

實戰(zhàn)

服務-A

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

    //本地服務調用
    testDao.insert(test);

    //發(fā)送半事務消息
    //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í)行本地事務
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {
        //獲取半事務消息
        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) {
            //說明本地事務提交失敗了,需要回滾
            return RocketMQLocalTransactionState.ROLLBACK;
        }
        
        //本地事務提交成功
        return RocketMQLocalTransactionState.COMMIT;
    }

    //事務回查
    @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) {
            //不存在,說明本地事務提交失敗,回滾
            return RocketMQLocalTransactionState.ROLLBACK;
        }
        
        //本地事務提交成功了
        return RocketMQLocalTransactionState.COMMIT;
    }
}

服務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服務收到消息:" + JSONObject.toJSONString(s));
    }
}

測試

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

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

此時服務-B也沒有消費到消息

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

這時候服務消費方也成功消費到消息了

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

相關文章

  • Java中List集合去除重復數(shù)據(jù)的方法匯總

    Java中List集合去除重復數(shù)據(jù)的方法匯總

    這篇文章主要給大家介紹了關于Java中List集合去除重復數(shù)據(jù)的方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • java 單例的五種實現(xiàn)方式及其性能分析

    java 單例的五種實現(xiàn)方式及其性能分析

    這篇文章主要介紹了java 單例的五種實現(xiàn)方式及其性能分析。的相關資料,需要的朋友可以參考下
    2017-07-07
  • MyBatis直接執(zhí)行SQL的工具SqlMapper

    MyBatis直接執(zhí)行SQL的工具SqlMapper

    今天小編就為大家分享一篇關于MyBatis直接執(zhí)行SQL的工具SqlMapper,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot2.0集成WebSocket實現(xiàn)后臺向前端推送信息

    SpringBoot2.0集成WebSocket實現(xiàn)后臺向前端推送信息

    這篇文章主要介紹了SpringBoot2.0集成WebSocket實現(xiàn)后臺向前端推送信息,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Jackson自定義序列化反序列化注解加解密字段詳解

    Jackson自定義序列化反序列化注解加解密字段詳解

    這篇文章主要介紹了Jackson自定義序列化反序列化注解加解密字段詳解,一些場景中,數(shù)據(jù)庫字段用于存儲json格式數(shù)據(jù),處于安全的考慮,該json數(shù)據(jù)中,某些敏感信息字段需要做加密存儲,例如身份證號、手機號等,需要的朋友可以參考下
    2023-11-11
  • Java?Chassis3熔斷機制的改進路程技術解密

    Java?Chassis3熔斷機制的改進路程技術解密

    這篇文章主要介紹了Java?Chassis?3技術解密之熔斷機制的改進路程實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Java添加Word文本水印和圖片水印

    Java添加Word文本水印和圖片水印

    這篇文章主要介紹了Java添加Word文本水印和圖片水印,文章圖文講解的很清晰,有對于這方面不懂得同學可以學習下
    2021-02-02
  • Java 遍歷list和map的方法

    Java 遍歷list和map的方法

    這篇文章主要介紹了Java 遍歷list和map的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Collections.shuffle()方法實例解析

    Collections.shuffle()方法實例解析

    這篇文章主要介紹了Collections.shuffle()方法實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java中用數(shù)組實現(xiàn)環(huán)形隊列的示例代碼

    java中用數(shù)組實現(xiàn)環(huán)形隊列的示例代碼

    這篇文章主要介紹了java中用數(shù)組實現(xiàn)環(huán)形隊列的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論