10分钟带你体验 Solon 的状态机
一、介绍
Solon 状态机,称为 Solon State Machine。它是一种可以管理状态、事件之间的关系,以及他们之间的转换。这是一个专门为应用程序中的状态管理和状态转换提供支持的框架。
它简化了事物对象在不同状态下,不同事件转化的代码管理,让其代码变得更加清晰明了。
本文将介绍 Solon State Machine 状态机在 Solon 框架下的使用,10分钟带你理解并上手使用 Solon 状态机
二、状态机的核心概念
首先,我们必须要了解 Solon 状态机的几个核心概念,如下
- 状态(State):代表着对象的当前状态
- 事件(Event):对象状态转变是因何而改变的
- 转换(Transition):定义了事物的状态是通过哪个事件变到了另一个状态
比如,最常见的就是订单系统,下面就简单模拟一下正常订单的状态流转:
- 用户下单(状态为:待支付)
- 用户支付成功(状态为:已支付待发货)
- 仓库已发货(状态为:已发货待收货)
- 用户成功收货(状态为:已收货)
三、代码
添加对应的 maven 依赖
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-statemachine</artifactId>
<version>3.5.1</version>
</dependency>
对于状态,由于非常固定,我们最好是使用枚举,如下OrderStatus.java
public enum OrderStatusEnum {
WAIT_PAY, //待支付
WAIT_DELIVER, //已支付待发货
WAIT_RECEIVE, //已发货待收货
RECEIVED; //已收货
}
还要定义一下事件的枚举
public enum OrderStatusEventEnum {
ORDER, //用户下单
PAY, //用户支付成功
DELIVER, //仓库已发货
RECEIVE; //用户成功收货
}
接下来我们就能定义转换了,在 Solon 框架下,我们可以定义一个 OrderStateMachine 托管类
@Managed
public class OrderStateMachine extends StateMachine<OrderStatusEnum,OrderStatusEventEnum, OrderEntity> {
public OrderStateMachine() {
// 待支付 -> 已支付待发货(支付成功)
from(OrderStatusEnum.WAIT_PAY).to(OrderStatusEnum.WAIT_DELIVER)
.on(OrderStatusEventEnum.PAY)
.then(c -> c.getPayload().setStatus(c.getTo()));
// 已支付待发货 -> 已发货待收货(仓库已发货)
from(OrderStatusEnum.WAIT_DELIVER).to(OrderStatusEnum.WAIT_RECEIVE)
.on(OrderStatusEventEnum.DELIVER)
.then(c -> c.getPayload().setStatus(c.getTo()));
// 已发货待收货 -> 已收货(用户收货)
from(OrderStatusEnum.WAIT_RECEIVE).to(OrderStatusEnum.RECEIVED)
.on(OrderStatusEventEnum.RECEIVE)
.then(c -> c.getPayload().setStatus(c.getTo()));
}
}
是不是感觉还缺了什么呢,配置中还缺少一个下单事件,这没有关系,这是我们初始的一个事件,不参于配置
我们写对应的 OrderController 接口即可,这边模拟一下,创建订单进行落库
@Controller
public class OrderController {
@Mapping("/create")
public Result<Void> create() {
// TODO 模拟订单落库
return Result.succeed();
}
}
重点是在后面的,支付这一个阶段,我们应该如何接入状态机,如下
@Controller
public class OrderController {
@Inject
private OrderStateMachine orderStatusMachine;
@Mapping("/create")
public Result create() {
// TODO 模拟订单落库
return Result.succeed();
}
@Post
@Mapping("/pay")
public Result pay() {
// TODO 模拟订单支付
return Result.succeed();
}
@Post
@Mapping("/payNotify")
public Result payNotify(Integer orderId) {
// TODO 支付成功后,使用状态机
// 模拟通过id查找一个订单对象
OrderEntity entity = new OrderEntity(orderId, OrderStatusEnum.WAIT_PAY);
// 使用状态机发送这个消息
orderStatusMachine.sendEvent(OrderStatusEventEnum.PAY, EventContext.of(entity.getStatus(), entity));
return Result.succeed();
}
}
10分钟带你体验 Solon 的状态机的更多相关文章
- 10分钟带你徒手做个Java线程池
摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理. 本文分享自华为云社区<放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧>,作者:冰 ...
- Azure IoT Hub 十分钟入门系列 (1)- 10分钟带你了解Azure IoT Hub 并创建IoT Hub
建议您先对<Azure 上 IoT 整体解决方案概览 >进行了解. 本文主要分享一个案例: 10分钟-了解Azure IoT Hub并创建Azure IoT Hub 本文主要有如下内容: ...
- 都9102年了,还不会Docker?10分钟带你从入门操作到实战上手
Docker简述 Docker是一种OS虚拟化技术,是一个开源的应用容器引擎.它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支 ...
- 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码
OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...
- 干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇
00 前言 之前一直做启发式算法,最近突然对精确算法感兴趣了.但是这玩意儿说实话是真的难,刚好boss又叫我学学column generation求解VRP相关的内容.一看里面有好多知识需要重新把握, ...
- 10分钟带你入门git到github
git的产生背景 开局先来一个故事吧,故事看完如果不想看枯燥无味的指令,没关系我已经把这篇文章的内容录制成了一个视频,点击文末阅读原文就可以观看.或者说你已经熟练掌握git的使用了,可以直接跳到总结部 ...
- 10分钟带你进入Swagger的世界,快来看一看吧
什么是Swagger? 如下引用swagger官方的解释 Swagger is a powerful yet easy-to-use suite of API developer tools for ...
- 干货 | 10分钟带你掌握branch and price(分支定价)算法超详细原理解析
00 前言 相信大家对branch and price的神秘之处也非常好奇了.今天我们一起来揭秘该算法原理过程.不过,在此之前,请大家确保自己的branch and bound和column gene ...
- 10分钟学会Less开发环境搭建与初体验
Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...
- Apache Shiro系列三,概述 —— 10分钟入门
一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...
随机推荐
- Java 内存模型与 Happens-Before 关系深度解析
在 Java 并发编程中,Java 内存模型(Java Memory Model, JMM)与 Happens-Before 关系是理解多线程数据可见性和有序性的核心理论.本文从 JMM 的抽象模型出 ...
- [书籍精读]《CSS世界》精读笔记分享
写在前面 书籍介绍:本书从前端开发人员的需求出发,以"流"为线索,从结构.内容到美化装饰等方面,全面且深入地讲解前端开发人员必须了解和掌握的大量的CSS知识点.同时,作者结合多年的 ...
- 直播预约丨《袋鼠云大数据实操指南》No.2:实时开发,如何成为数据智能化的有效驱动力
近年来,新质生产力.数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕. 面对这些引领经济转型的新兴概念,为了 ...
- DRF之过滤类源码分析
DRF之过滤类源码分析 [一]过滤类介绍及BaseFilterBackend Django REST framework(DRF)中的过滤类允许你在API视图中对查询进行过滤,以根据特定条件筛选结果集 ...
- springboot~入门第二篇~页面html跳转~
遇到的问题:按照别人的blog搭jsp页面就是html页面跳转不了,总是如图: 终于找到了一个能用的blog ,换 thymeleaf(html页面跳转)成功. 控制器代码 注意下: @Control ...
- CPU的几核几线程是什么意思?
前言 经常看到 电脑硬件的配置参数上 是这么标注cpu的 是不是不太明白 是什么意思? 命名 每个cpu型号都有自己名字,比如上边举例的那款叫做 i5-12600k i5指得是 英特尔公司把自家cpu ...
- 使用IntelliJ IDEA 配置Maven项目
今天准备写个Java Web项目,决定用新安装的IntelliJ IDEA来试试,毕竟听别人说这个IDEA管理Maven项目比Eclipse方便,于是乎在网上找到了一篇超级有用的入门级配置教程,接下来 ...
- vs 运行 qt 项目的注意事项
简介 RT 1 使用vs 打开 qt 项目 https://blog.csdn.net/weixin_44840658/article/details/99693803 2 运行项目之后 会因为缺少相 ...
- 深度解密:Win11 22000.100界面更美观、更顺手
微软官方面向Dev通道的Insider会员又推送Windows 11新预览版系统了,操作系统版本号升级为Build 22000.100. 这是Windows 11预览版上线以来的第四次累积更新,微软继 ...
- (译) 理解 Prometheus 的范围向量 (Range Vector)
Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档.谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机 ...