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.mzph.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…