Solon Cloud Event 新的事務特性與應用

1、Solon Cloud Event?

是 Solon 分布式事件總線的解決方案。也是 Solon “最終一致性”分布式事務的解決方案之一

2、事務特性

事務?就是要求 Event 有原子性,當多個 Event 發布時,要么全成功,要么全失敗。

public class EventDemo {public void event_tran() {//新建一個 Event 事務EventTran eventTran = CloudClient.event().newTran();try {//發布,并使用事務CloudClient.event().publish(new Event("user.event1", "test1").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test2").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test3").tran(eventTran));//如果沒問題,提交事務eventTran.commit();} catch (Throwable ex) {//如果有問題,回滾事務eventTran.rollback();}}
}

上面的體驗與經典的 Jdbc 事務是很像的。加入 Solon 的事務注解管理后,體驗可以再簡潔些,也能與 Jdbc 事務整合到一起。

@Component
public class EventDemo {//使用 @Tran 管理事務(將 jdbc, event 事務整合到一起)@Tranpublic void event_and_jdbc_tran() {//新建一個 Event 事務,并加入 @Tran 的管理EventTran eventTran = CloudClient.event().newTranAndJoin(); CloudClient.event().publish(new Event("user.event1", "test1").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test2").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test3").tran(eventTran));}
}

3、擬模真實的場景應用:

我們設計一個用戶注冊的場景應用:

  • 持久層添加用戶記錄
  • 注冊后發布一個已注冊事件;再發布一個10天后觸發的已喚醒事件
  • 在已注冊事件里,我們給用戶送10個金幣;再送手機100元沖值
  • 在已喚醒事件里,我們檢查用戶的活動行為;如果有,再送100個金幣(作為獎勵);如果沒發推送,告知有抽獎

主服務程序,負責主業務:

@Component
public class UserService {@InjectUserDao userDao;//用戶注冊@Tranpublic void userRegister(long userId, String name){userDao.addUser(userId, name);this.onUserRegistered(userId);}//當用戶完成注冊時(發布事件)private void onUserRegistered(long userId) {String eventJson = String.format("{\"userId\":%d}", userId);Date  eventTime = DateTime.Now().addDay(10);EventTran eventTran = CloudClient.event().newTranAndJoin();//發布用戶已注冊事件CloudClient.event().publish(new Event("user.registered", eventJson).tran(eventTran));//發布用戶已喚醒事件(用于檢查用戶在10內,有沒有活動行為)CloudClient.event().publish(new Event("user.reawakened", eventJson).scheduled(eventTime).tran(eventTran));}
}

次服務程序,負責輔助業務(也可以合到主服務程序):

@CloudEvent("user.registered")
public class UserRegisteredEventHandler implements CloudEventHandler {@InjectUserService userService;@InjectMobileService mobileSerivce;@Overridepublic boolean handler(Event event) throws Throwable {long userId = ONode.load(event.context()).get("userId").getLong();//送10個金幣userService.addGold(userId, 10);//送手機充值100塊String mobie = userService.getMobile(userId);mobileSerivce.recharge(mobile, 100);return true;}
}@CloudEvent("user.reawakened")
public class UserReawakenedEventHandler implements CloudEventHandler {@InjectUserService userService;@InjectPushService pushService@Overridepublic boolean handler(Event event) throws Throwable {long userId = ONode.load(event.context()).get("userId").getLong();if (userService.hasLive(userId, 10)) {//再送100個金幣userService.addGold(userId, 100);} else {//獲取設備idString duid = userService.getDuid(userId);//發布推送pushService.push(duid, "有100個金幣等你來拿喲...")}return true;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13250.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyQt5 中的 List View

文章目錄 1. 基礎概念2. 創建 List View2.1 PyQt5 中一個簡單的 List View 實例2.2 代碼解釋2.3 運行結果 3. 數據模型3.1 標準模型3.2 自定義模型 4. 自定義 List View4.1 使用樣式表 (QSS)4.2 設置項委托 (Item Delegate) 5.事件處理6. 與數據交互6.1 添加數據6.2 刪除數據6.…

【哈希】Leetcode 205. 同構字符串【簡單】

同構字符串 給定兩個字符串 s 和 t ,判斷它們是否是同構的。 如果 s 中的字符可以按某種映射關系替換得到 t ,那么這兩個字符串是同構的。 每個出現的字符都應當映射到另一個字符,同時不改變字符的順序。不同字符不能映射到同一個字符上&am…

如何解決 Scrapy 下載圖片時的文件名錯誤問題

在使用 Scrapy 的 ImagesPipeline 下載圖片時,有時會遇到因為文件名的問題導致下載失敗的情況。本文將詳細解釋這種錯誤的原因,并提供一個簡單易懂的解決方案,幫助大家避免類似的問題。 問題描述 在下載圖片時,如果圖片的名字是…

C語言到底怎么學?

C語言到底怎么學? 1、工欲善其事,必先利其器 這里介紹幾個華清遠見學習C語言必備的工具: VMware、ubuntu。 VMware是一家提供虛擬化軟件和解決方案的公司,VMware的旗艦產品是VMware Workstation,這是一種虛擬機軟件,…

echers配置項:數據過多時,折疊數據縮放查看

當數據過多時,如上圖所示的時間點,會自動折疊,此時鼠標縮放還不起作用,我們配置如下代碼 let option {dataZoom: [{startValue: 05:00}, // 這個值需要跟 第一條 時間數據對應上{type: inside}], }配置后,就可以進行…

echers配置項:折線圖,折現的顏色修改

如上圖所示:紅框內的折現顏色修改,并隱藏默認的點 series: [{data: [1, 230, 224, 218, 135, 147, 760,1500,1200,2500,2000],type: line,lineStyle: {color: #00DBFE // 折現顏色},symbol:none, // 不顯示點smooth: true, // 折現角度:圓滑…

hadoop生態圈集群搭建(持續更新240513)

Hadoop生態圈 Linux1.修改ip地址2.重啟network服務3.安裝插件4.關閉防火墻5.創建用戶6.創建目錄7.修改目錄的所屬主和所屬組為lxy8.修改主機名:hadoop102 (注意名字后面不要加空格)9.修改hosts文件10.等插件都裝完后再重啟Linux11.把xshell的登錄用戶換成lxy (注意&…

5W 3KVAC隔離 寬電壓輸入 AC/DC 電源模塊——TP05AL系列

TP05AL系列產品是一款經濟型開板式開關電源,輸出功率為5W,具有可靠性高、小體積、性價比高等特點,廣泛用于工控和電力儀器、儀表、智能家居等相關行業。

通過 Apple Vision Pro 釋放創造力:深入研究空間計算

Apple 最新進軍空間計算領域的 Apple Vision Pro,標志著重新定義我們與技術交互方式的重大飛躍。空間計算超越了傳統界限,允許用戶以無縫集成到物理世界的方式參與 2D 和 3D 內容。 我們可以關注兩種類型的體驗: 在空間中渲染 2D 內容。這涉及將現有設備窗口投影到空間領域…

通過C++和libcurl下載網易云音樂音頻文件的5個簡單步驟

概述 在網絡編程中,使用C和libcurl庫下載文件是一項常見的任務。網易云音樂作為中國領先的在線音樂服務平臺之一,以其豐富的音樂資源、優質的音質和智能推薦系統而廣受歡迎。由于其平臺提供了大量的正版音樂資源,用戶在下載音頻文件時可能會…

開源發布:JAVA版低代碼報文網關-通過簡單配置快速對接銀行渠道

大家好,我是隱墨星辰,自從《百圖解碼支付系統設計與實現》專欄中的文章《圖解支付報文網關:一種低代碼報文網關的設計思路與核心代碼實現》發表以來,不少同學留言或私信問我如何實現,說是雖然看懂了思路,但…

pycharm 里面安裝 codeium 插件的時候,不能夠彈出登錄界面

pycharm 里面安裝 codeium 插件的時候,不能夠彈出登錄界面 pycharm 里面安裝 codeium 插件的時候,不能夠彈出登錄界面--解決如下A pycharm 里面安裝 codeium 插件的時候,不能夠彈出登錄界面–解決如下 #踩坑/pycharm/codeium插件無法登錄 安…

微信聯登報invalid code, rid: 66446806-0826d0b4-3a94ce3a ,錯誤碼:40029解決方法

目錄 一、問題描述二、問題原因三、解決方法 一、問題描述 微信登錄報錯: invalid code, rid: 66446806-0826d0b4-3a94ce3a ,錯誤碼:40029二、問題原因 后端設置的 appsecret 和 appid 與前端的 appid 不一致。 三、解決方法 檢查是否已…

用Ai編寫一個電機驅動程序

問:幫我寫一個步進電機的控制程序,要有包括加減速,以及電機步中斷處理函數。 答:編寫一個步進電機的控制程序涉及到硬件層面的操作,通常需要依賴特定的硬件平臺和相應的驅動程序。以下是一個簡化的示例,它展…

制氧機負離子的作用與好處深度解析

隨著現代生活節奏的加快,空氣質量逐漸下降,人們對健康生活的追求也日益增強。在這樣的背景下,制氧機負離子功能因其多重健康效益而備受關注。本文將深入探討制氧機負離子的作用與功效,幫助大家更好地了解并應用這一健康科技。 我們…

單片機燒錄程序時“DTR的低電平復位,RTS高電平進入bootloader”有關的串口Modem聯絡信號

燒錄程序時常見DTR和RTS引腳 參考,參考視頻 因為常常使用的都是串口下載程序,常用的芯片CH340系列,下圖中標紅的引腳是MODEM聯絡信號,其中常見的DTR和RTS就是常見的串口Modem網絡輸出信號,也就是通過燒錄軟件控制的接…

VUE v-for中修改data數據

有個需求,要求使用v-for生成序號,但是中間可能會中斷,例如: 1 2 3 4 (此行無序號) 5 6 (此行無序號) (此行無序號) (此行無序號) 7 8 ...... 想著這還不簡單,只要在data中定義一個變量,然后每次調用時就行…

CMMI3認證如何升級為CMMI5認證

眾所周知,CMMI認證體系共分為五個等級,一級最低,五級最高。企業初次申報一般從三級做起,在這個等級水平上,企業在項目研發管理方面已經具備一定的規范程度,對企業的過程改進有著顯著成效,在同行…

wps本地js宏基礎語句

IF語句 //str.indexOf("")的值為-1時表示不包含 function 是否包含關鍵字(){var str "陳表達真是個大帥哥";if(str.indexOf("大") ! -1){alert("是的,他是非常大");} }//str.includes("")返回一個布爾值&#x…

深入解析Wireshark1:從捕獲到分析,一網打盡數據包之旅

目錄 1 認識 Wireshark 1.1 選擇網卡界面 1.2 捕獲數據包界面 1.3 常用按鈕功能介紹 1.4 數據包列表信息 1.5 數據包詳細信息 2 數據包案例分析 Frame: 物理層的數據幀概況 Ethernet II: 數據鏈路層以太網幀頭部信息 Internet Protocol Version 4 (IPv4): 互聯網層IP…