首页 > 其他分享 >❤️‍ Solon Cloud Event 新的事务特性与应用

❤️‍ Solon Cloud Event 新的事务特性与应用

时间:2024-05-16 18:55:06浏览次数:17  
标签:Solon CloudClient tran userId event Cloud Event eventTran

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,CloudClient,tran,userId,event,Cloud,Event,eventTran
From: https://www.cnblogs.com/noear/p/18196534

相关文章

  • SpringCloud
    SpringCloud回顾之前的知识JavaSE数据库前端ServletHttpMybatisSpringSpringMVCSpringBootDubbo、Zookeeper、分布式基础Maven、GitAjax、Json...../串一下自己会的东西数据库MybatisSpringSpringMVCSpringBootDubbo、Zookeeper、分布式基础......
  • SpringCloud项目准备
    一、简介SpringCloud是一系列框架的有序集合。它基于SpringBoot开发,继承了SpringBoot快速构建和自动化配置的优点,提供了开箱即用、快速启动的特点。SpringCloud为开发分布式微服务项目,提供了完整的解决方案,如:服务注册与发现:Consul、Nacos、Etcd、Eureka服务调用与负载均......
  • Java Solon v2.7.6 发布
    JavaSolon是什么框架?Java“新的”应用开发框架。开放原子开源基金会,孵化项目。从零开始构建(非java-ee架构),有灵活的接口规范与开放生态。追求:更快、更小、更简单提倡:克制、简洁、高效、开放、生态有什么特点?更高的计算性价比:并发高2~3倍;内存省50%更快的开发效......
  • 使用qemu-system-x86_64和cloud-init修改qcow2镜像密码
    方法来自于:CoretutorialwithQEMU依次执行下面的命令sudoaptinstallqemu-system-x86mkdirtempcdtemp#以此镜像为例wgethttps://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.imgcat<<EOF>user-data#cloud-configpassword:123ch......
  • SpringBoot SpringCloud Spring Cloud Alibaba 版本对应关系
    最近公司的项目扫描出一些安全漏洞,于是让我给项目中的依赖升下级。有部分涉及到SpringBoot和SpringCloud,因此要考虑到兼容性,特此记录下查询各版本之间对应关系的方法。靠谱的方法还是要从官网得到,参考文章:工具篇--SpringBoot与SpringCloud的版本对应关系&SpringBoot与JDK对应关系......
  • Java开发微服务SpringCloudAlibaba+Nginx+Vue+Mysql+RabbitMQ
    项目介绍随着互联网技术的飞速发展和移动设备的普及,自媒体平台已经成为人们获取信息、传播观点、实现自我价值的重要途径。自媒体平台的设计与实现,不仅需要考虑如何提供便捷的内容发布、编辑和管理功能,还需要考虑如何构建健康的内容生态,保证信息的真实性和可靠性,防止虚假信息的传......
  • 【SpringCloud】黑马学习笔记-Nacos
    #1.Nacos安装(黑马教程安装材料)##1.1Windows安装开发阶段采用单机安装即可。###1.1.1下载安装包在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:GitHub主页:https://github.com/alibaba/nacosGitHub的Release下载页:https://github.com/alibaba/na......
  • 微服务Spring Cloud17_Spring Cloud Bus服务总线12
    一、问题前面已经完成了将微服务中的配置文件集中存储在远程Git仓库,并且通过配置中心微服务从Git仓库拉取配置文件,当用户微服务启动时会连接配置中心获取配置信息从而启动用户微服务。如果我们更新Git仓库中的配置文件,那用户微服务是否可以及时接收到新的配置信息并更新呢......
  • 微服务Spring Cloud17_Spring Cloud Config分布式配置中心11
    一、简介在分布式系统中,由于服务数量非常多,配置文件分散在不同的微服务项目中,管理不方便。为了方便配置文件集中管理,需要分布式配置中心组件。在SpringCloud中,提供了SpringCloudConfig,它支持配置文件放在配置服务的本地,也支持放在远程Git仓库(GitHub、码云)。使用SpringCl......
  • 微服务Spring Cloud17_Spring Cloud Gateway网关10
    一、简介SpringCloudGateway是Spring官网基于Spring5.0、SpringBoot2.0、ProjectReactor等技术开发的网关服务。SpringCloudGateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等。SpringCloudGateway为微服务架构提供简单、有效且统一的API路由管理方式......