❤️‍🔥 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);
DateeventTime = 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 handle(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 handle(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;
}
}

 


相關推薦

2024-05-21

Java Solon 是什么框架? Java “新的”应用开发框架。开放原子开源基金会,孵化项目。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单 提倡: 克制、简洁、高效、开放、生态

2024-04-18

Java Solon 是什么框架? Java “新的”应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单 提倡: 克制、简洁、高效、开放、生态 有什么特点? 更高的计算性

2023-05-08

输出 修复国际化导出json时,有[]的会错乱 配置管理/应用属性 增加 label ,做为内部显示分组 应用监视 调整时间间隔 快速入门 了解开发框架与镜像 组件 说明 开发框架   org.noear:water.client 框

2022-09-08

注" 记录接口和显示 新增 "证书监视" 管理界面 添加 "应用监视" 批量禁用启用支持 添加 "数据监视" 批量禁用启用支持 solon 升级为:1.10.2(项目地址:https://gitee.com/noear/solon) snack3 升级为:3.2.35(项目地址:https://gitee.co

2023-01-09

LConnection 使用处的缓存处理(服务状态检测,证书检测,应用检测等...) 调整 wateradmin 服务,改由 smart-http 驱动(支持国产框架) solon 升级为:1.12.1(项目地址:https://gitee.com/noear/solon) snack3 升级为:3.2.50(项目地址:htt

2022-04-08

式解决方案(可以理解为微服务架构支持套件)。基于 Solon 框架开发,并支持完整的 Solon Cloud 规范;已在生产环境奔跑了4年。 功能约等于:consul + rabbitmq + elk + prometheus + openFaas + quartz 等一些别的功能,并有机结合在一起。

2023-11-03

olon Native 里程碑意义!)。让我们对 Java 原生编译又起了新的希冀。总体来说: 适配调整完后,代码变化不太大 整个过程是很麻烦的。因为社区版不能调试,只能不断试(发现缺什么,就补什么配置) Solon 是什么框架?

2023-10-17

ues/I88AZ3 调整 所有模块的单测都升级为 junit5(落实最新的 CONTRIBUTING 规范) 调整 water-solon-cloud-plugin 本地调试时服务注册改为被动检测(之前为主动上报) 调整 HttpServerConfigure::enableSsl 允许自己设定 SSLContext(方便国密处

2022-04-11

,90Mb 的变成了 9Mb) 关于 Solon Solon 是一个更现代感的应用开发框架,轻量、开放生态型的。支持 Web、Data、Job、Remoting、Cloud 等任何开发场景。 强调,克制 + 简洁 + 开放 + 生态的原则 力求,更小、更少、更快、更自由的

2022-12-25

调整 EventBus:push 非异常事件,允许透传异常(从而支持事务回滚传导) 升级 sqltoy 为 5.2.28 进一步了解 Solon: 《想法与架构笔记》 《生态预览》 《与 Spring Boot 的区别?》 《与 Spring Cloud 的区别?》 项目仓库:

2024-06-07

Solon 是什么框架? Java “新的”应用开发框架。开放原子开源基金会,孵化项目。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单 提倡: 克制、简洁、高效、开放、生态 有

2023-09-01

代旧的 Utils IO功能(旧的标为弃用) 增加 @Tran 事务监视事件支持,并增加 message 属性(只在最外层触发事件) 调整 kafka-solon-cloud-plugin 如果没有订阅,则不启用消费端 调整 PathLimiter 的弃用提示方式 调整 solon.cloud

2023-12-30

。 修复并行LOAD DATA无法正确分割复杂文本,同时会有长事务不提交导致UNDO持续增长的问题。 修复在FOR LOOP循环中用到ROWNUM时,在每轮循环中,数据查询结果集中的ROWNUM不能被重置从0再开始的问题。 注意事项 GreatSQL VS MySQL

2023-05-04

Java 新的生态型应用开发框架,Solon :更快、更小、更简单。从零开始构建,有自己的标准规范与开放生态: 150多个生态插件,可以满足各种场景开发 大量的国产框架适配,可以为应用软件国产化提供更好支持 相对于 Spr