❤️🔥 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 事务整合到一起)
@Tran
public 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 {
@Inject
UserDao userDao;
//用户注册
@Tran
public 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 {
@Inject
UserService userService;
@Inject
MobileService mobileSerivce;
@Override
public 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 {
@Inject
UserService userService;
@Inject
PushService pushService
@Override
public 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 {
//获取设备id
String duid = userService.getDuid(userId);
//发布推送
pushService.push(duid, "有100个金币等你来拿哟...")
}
return true;
}
}
❤️🔥 Solon Cloud Event 新的事务特性与应用的更多相关文章
- Solon Cloud 分布式开发套件清单与快速概览
Solon Cloud 是一系列的接口标准和配置规范.Solon Cloud 为常见的分布式系统模式提供了一种简单且方便的编程模式,帮助开发人员构建有弹性的.可靠的.协调的应用程序.Solon Clo ...
- Solon 框架详解(十一)- Solon Cloud 的配置说明
Solon 详解系列文章: Solon 框架详解(一)- 快速入门 Solon 框架详解(二)- Solon的核心 Solon 框架详解(三)- Solon的web开发 Solon 框架详解(四)- ...
- Solon & Solon Cloud 1.5.62 发布,轻量级 Java 基础开发框架
Solon 已有120个生态扩展插件,此次更新主要为细节打磨,且对k8s和docker-compose更友好: 1.插件 solon.coud ,事件总线增加支持本地同主题多订阅模式(以支持同服务内, ...
- 轻量级 Java 基础开发框架,Solon & Solon Cloud 1.5.40 发布
Solon 已有120个生态扩展插件,此次版本以细节打磨为主: 增加 mybatisplus-solon-plugin 插件 //至此,Solon 已完成国内外主流的5个ORM框架插件适配 插件 so ...
- 轻量级 Java 基础开发框架,Solon & Solon Cloud 1.5.52 发布
Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 插件 mybatis-solon-plugin 增加 mappers 单行配置支持 之前的多行模式: mybatis.db1: type ...
- 根据backup-my.cnf来生成新的事务日志文件
使用rpm包安装xtrabackup ## 安装依赖包yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-D ...
- 什么是事务?事务特性?事务隔离级别?spring事务传播特性?
一.事务的概述 什么是事务? 在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句,当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交.判断事务是否配置成功的关键点在于出现异常时事 ...
- spring的4种事务特性,5种隔离级别,7种传播行为
spring事务: 事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (con ...
- 事务特性,事务的隔离级别,并发事务可能出现的问题,spring事务 数据库锁
1.0 事务特性(ACID) Atomicity:原子性,一个事务不可以被拆分 Consistency:一致性,在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态, ...
- 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)
转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...
随机推荐
- Java 包和 API 深度解析:组织代码,避免命名冲突
Java 包和 API Java 中的包 用于将相关的类分组在一起.可以将其视为文件目录中的一个文件夹.我们使用包来避免名称冲突,并编写更易于维护的代码. 包分为两类: 内置包(来自 Java API ...
- Qt通过UDP发送广播
// x.h QUdpSocket* udp = nullptr; // UDP对象 void createUdpAndSendData(); // 创建UDP对象和发送广播数据 void dropU ...
- mybatis复习(二)
简介 mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的 ...
- VSCode如何通过Ctrl+P快速打开node_modules中的文件
背景 咱们新建一个NodeJS项目,必然会安装许多依赖包,因此经常需要查阅某些依赖包的源码文件.但是,由于node_modules目录包含的文件太多,出于性能考虑,在VSCode中默认情况下是禁止搜索 ...
- Ubuntu SVN 需要证书及密码验证问题
问题概览 问题一 Ubuntu 20.04 下使用 SVN ,会报错 SVN 的证书错误,无论是选择接受 t 还是永久接受 p,下次都会要求再次接受:在 kali 或者 Windows 上没有出现该问 ...
- mysql 必知必会整理—数据插入和更新还有删除[十]
前言 简单整理数据插入更新还有删除. 正文 插入: INSERT INTO customers( customers.cust_address, customers.cust_city, custom ...
- 重新整理 .net core 实践篇—————grpc工具[三十四]
前言 简单整理一下grpc工具. 正文 工具核心包: Grpc.Tools 这个是项目要引用的包,用来生成cs代码的. dotnet-grpc 这个就是cli,命令行工具 dotnet-grpc 核心 ...
- python 远程windows系统执行cmd命令
如果你的服务器是windows系统,不想一台一台mstsc远程到桌面上去操作,python是有模块可以远程处理的:winrm pip install pywinrm 安装模块即可 windows系统服 ...
- javascript现代编程系列教程之七——字符数据类型-字符集-编码解码-常用字符串处理方法(七)
一.字符集 Unicode:Unicode 是一个字符集(Charset),包含了世界上所有的字符.每个字符在 Unicode 中都有其唯一对应的数字编号,这就是我们常说的 Unicode 码. UT ...
- docker containerd runc containerd-shim等组件的关系
早期 kubelet 创建容器工作原理 因为 docker 出生的比 k8s 早,所以 k8s 早期的容器运行时都是基于 docker 的,kubelet 通过 docker 的 api 创建容器.后 ...