当前位置: 首页 > news >正文

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 {@Injectprivate 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();}
}
http://www.sczhlp.com/news/50380/

相关文章:

  • 题解:P10455 Genius Acm
  • 如何在网站上做标注微信手机网站三合一
  • 福州企业建站系统模板西安博网站建设
  • 龙岗网站建设哪家技术好阜阳网站建设公司
  • 网站建设有几种方案培训班网页设计
  • 梧州专业网站推广网站建设600元全包
  • 建设内网网站流程百度自动驾驶技术
  • 在线做网站wordpress 加密
  • 网站详细设计天眼网查个人
  • 哪个网站可以做免费商业推广百度上做推广怎么做
  • 阆中网站建设01hl做企业网站必须要座机吗
  • 山楂树建站公司优化方案的格式及范文
  • CSP-2023 游记 + AFO记
  • 3. LangChain4j + 低阶 和 高阶 API的详细说明 - Rainbow
  • 网站开发技术现状地税局网站怎么做变更
  • 做网站敲代码的图片做h5的网站页面
  • 外贸的网站有哪些平面设计素材网站哪个好
  • 网站销售需要注册公司吗jeykll和wordpress
  • 网站改版前端流程经验室内设计师联盟网官网
  • CF344B Simple Molecules - 题解
  • CMake构建学习笔记22-libxml2库的构建
  • CF81B Sequence Formatting - 题解
  • CF394A Counting Sticks - 题解
  • 10.3.2 Off-policy 策略梯度定理
  • 网站建设细化流程怎么注册wordpress账号
  • 校园网站建设多少钱海洋牧场网站建设
  • 山东网站建设排行榜可以做数据图的的网站
  • 小程序网站开发怎么样甘孜建设机械网站首页
  • 网站 解析网页设计结课报告
  • 做微信的网站秀客中色十二冶金建设集团有限公司网站